Java反射:入门、使用

参考:大白话说Java反射:入门、使用、原理

侵删

笔记:

  1. JDK源码那里看不懂,所以原理那里没看。
  2. 想理解反射是什么,得理解正射,这样子进行类对象的初始化,我们可以理解为「正」。
    Apple apple = new Apple(); //直接初始化,「正射」
    apple.setPrice(4);
  3. 而反射则是一开始并不知道我要初始化的类对象是什么,自然也无法使用 new 关键字来创建对象了。这时候,我们使用 JDK 提供的反射 API 进行反射调用:

    Class clz = Class.forName("com.chenshuyi.reflect.Apple");
    Method method = clz.getMethod("setPrice", int.class);
    Constructor constructor = clz.getConstructor();
    Object object = constructor.newInstance();
    method.invoke(object, 4);
  4.  上面两种通过调用类的对象的方法产生的结果是完全一样的,但是思路完全不一样。第一段代码在未运行时就已经确定了要运行的类(Apple),而第二段代码则是在运行时通过字符串值才得知要运行的类(com.chenshuyi.reflect.Apple)。
  5. 所以说什么是反射?反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。

  6. 从代码中可以看到我们使用反射调用了 setPrice 方法,并传递了 14 的值。之后使用反射调用了 getPrice 方法,输出其价格。(先设置属性的值,再获取出来)
  7. public class Apple {
    
        private int price;
    
        public int getPrice() {
            return price;
        }
    
        public void setPrice(int price) {
            this.price = price;
        }
    
        public static void main(String[] args) throws Exception{
            //正常的调用
            Apple apple = new Apple();
            apple.setPrice(5);
            System.out.println("Apple Price:" + apple.getPrice());
            //使用反射调用
            Class clz = Class.forName("com.chenshuyi.api.Apple");
            Method setPriceMethod = clz.getMethod("setPrice", int.class);
            Constructor appleConstructor = clz.getConstructor();
            Object appleObj = appleConstructor.newInstance();
            setPriceMethod.invoke(appleObj, 14);
            Method getPriceMethod = clz.getMethod("getPrice");
            System.out.println("Apple Price:" + getPriceMethod.invoke(appleObj));
        }
    }
  8. Java反射:入门、使用
  9. Java反射:入门、使用
  10. 下面的反射源码解析看不懂,以后补充。
上一篇:Java向上转型和向下转型


下一篇:配备 Apple T2 安全芯片的 Mac 电脑怎样用U盘装系统