Java反射
就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。
1、得到Class的三种方式 (获取Class对象)
- 1、对象调用
getClass()
方法 - 2、类名
.class
,说明任何类都有一个静态成员变量class - 3、Class类的
forName
静态方法获得
当 new出一个新对象时,jvm会加载这个类的class
字节码文件,此时 jvm 会去本地磁盘找类.class
,将它读入内存,同时产生一个该类的class
对象,一个类有且仅会有一个class
对象
2、通过反射获取构造器方法并调用建立实例对象
//获取到Class对象后
Class对象.getConstructor() //获取单个公有构造器 有多个时,传入参数类型找特定的构造器
.getConstructors()
.getDeclaredConstructor(int.class) //获取单个构造器方法,该方法可以私有、受保护
.getDeclaredConstructors()
Constructor constructor = Class对象.getConstructor()
constructor.setAccessible(true);//私有情况下暴力访问(忽略掉访问修饰符) private修饰的属性方法都要解除限制
Object obj = constructor.newInstance(); //调用构造方法
3、获取成员变量且调用
//利用反射得到class对象同时实例化对象obj
Class对象.getField()
.getFields() //获取所有属性
.getDeclaredField(String fieldName) //获取特定字段的属性
.getDeclaredFields()
//调用
//Field.set(Object obj,Object value) 设置字段所在对象 设置字段的值
Field NameField= Class对象.getDeclaredField(String fieldName);
//NameField.setAccessible(true);//暴力反射,解除私有限定
NameField.set(实例化对象obj,fieldValue);
4、获取成员方法且调用(和操作成员变量类似)
//利用反射得到class对象同时实例化对象obj
//同上一样,可以传入方法名,参数类型找指定方法
Class对象.getMethod(String MethodName,int.class,String.Class)
.getMethods()
.getDeclaredMethod()
.getDeclaredMethods()
//调用
Method.invoke(Object obj,Object... args)//如果需要也要解除私有限制