1. 反射机制是什么?
反射机制就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,并能够直接操作程序的内部属性, 还能够动态实例化该类的对象等。
2. 反射机制能做什么?
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法,包括构造方法、实现的接口、父类等
- 在运行时调用任意一个对象的方法
3. 三种生成Class对象的方法
1) 类名.class
虚拟机将类装入内存,但不做类的初始化工作,返回Class对象
2) Class.forName("包名.类名")
虚拟机静态加载类,对类进行静态初始化
3) 实例对象.getClass()
对类进行静态初始化、非静态初始化;返回实例对象运行时真正所指的对象(,即最终子类对象, 因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象
4. 反射机制常用API
1) 通过一个对象获得完整包名和类名
Reflect reflect = new Reflect();
System.out.println(testReflect.getClass().getName());
// .getName(): 返回类名/方法名
2) 获取一个对象的父类、实现的接口和构造函数
Class<?> class = Class.forName("test.Reflect");
//取得父类
Class<?> parentClass = class.getSuperclass();
//获得所有接口
Class<?> intes[] = class.getInterfaces();
//获得全部的构造函数
Constructor<?> cons[] = class.getConstructors();
3) 更多APIField getField(String name)
获取名为name的public字段Field getFields()
获取所有的public字段Field getDeclaredField(String name)
获取名为name的所有字段,包括public、private、protectedField getDeclaredFields()
获取所有的字段,包括public、private、protectedConstructor[] getConstructors()
Constructor getConstructor(Class[] params)
返回形参结构与params顺序相同的构造函数Method[] getMethods()
Method getMethod(String name, Class[] params)
返回名称为name,形参结构与params顺序相同的方法
4) 开始使用Reflection:
用于reflection的类,都可以在java.lang.reflect包中找到.使用步骤
(1)获得想操作的类的java.lang.Class对象, 如 String.class、Class.forName("java.lang.String")、str.getClass();
(2)调用getDeclaredMethods()等方法, 以获取该类中定义的方法列表
(3)使用reflection API来操作这些信息
-
field的简单应用
Rectangle r = new Rectangle(2, 3); Field heightField = r.getClass().getField("height"); System.out.println(heightField.get(r));//结果: 3 heightField.set(r, 1); System.out.println(heightField.get(r));//结果: 1