反射
由于最近要涉及框架相关的编程,所以这里及记录下老知识,学而时习之。
反射定义:总结为,反射是在不知道所要使用类具体构成的基础上,在运行时获取类的字节码来获得此类的全部信息,包括构造器,成员变量等。
与常规实例化对象不同,反射是在运行之前不知道类的基础上,对此类进行实例化。常用于各框架的底层使用和环境切换。
(盗图,悄悄地)

需要理解,class对象只保留一个,所以不同方式得到的class对象地址都是相同的。
以下为反射核心使用方式:取反射的 Class 对象 -> 通过反射创建类对象 -> 通过反射获取类属性方法及构造器。
public class Apple { private int price;
public int getPrice() { return price; } public void setPrice(int price) { this.price = price; }
public int name
}
1.获取反射的class对象。
三种方式:
a.Class clz = Class.forName("java.lang.String");
b.Class clz = String.class;
c.String str = new String("Hello");
Class clz = str.getClass();
常用 a 方式,此方式符合反射的在运行前不知道类的信息的基本条件,可用于配置文件配置,方便项目迭代。
2.通过反射创建类对象
两种方式:
a.通过 Class 对象的 newInstance() 方法。
Class clz = Apple.class; Apple apple = (Apple)clz.newInstance();
b.通过 Constructor 对象的 newInstance() 方法。
// 无参构造器
Class clz = Apple.class;
Constructor constructor = clz.getConstructor();
Apple apple = (Apple)constructor.newInstance();
// 有参构造器
Class clz = Apple.class;
Constructor constructor = clz.getConstructor(String.class, int.class);
Apple apple = (Apple)constructor.newInstance("红富士", 15);
3.通过反射获取类属性方法
调用成员表变量,方法,构造器等的方式都差不多。不同的是调用公有的,还是私有的。
a.公有方法的调用
Class clz = Class.forName("com.zhenai.api.Apple"); // 根据 Class 对象实例获取 Constructor 对象
Method setPriceMethod = clz.getMethod("setPrice", int.class); // 利用 invoke 方法调用方法
Object result = setPriceMethod.invoke(appleObj, 14);
b.私有方法的调用
Class clz = Class.forName("com.zhenai.api.Apple"); // 根据 Class 对象实例获取 Constructor 对象
Method setNameMethod = clz.getDeclaredMethod("setName", String.class); // 利用 invoke 方法调用方法
setNameMethod.setAccessible(true); // 解除私有限定
Object result = setPriceMethod.invoke(appleObj, "红富士");
上述中的有些方法是没有的,都是假设的,理解思想最重要。后面如果有时间看各框架的源码,在来更新反射相关知识。
参考:https://www.cnblogs.com/chanshuyi/p/head_first_of_reflection.html
https://blog.csdn.net/sinat_38259539/article/details/71799078
浙公网安备 33010602011771号