疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java反射机制详解


 

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) 更多API
Field getField(String name) 获取名为name的public字段
Field getFields()获取所有的public字段
Field getDeclaredField(String name)获取名为name的所有字段,包括public、private、protected
Field getDeclaredFields()获取所有的字段,包括public、private、protected
Constructor[] 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