目录
1、反射简介
2、反射作用
3、反射实现
4、反射操作泛型
5、动态编译
1、反射简介
指的是可以在运行是加载、探知、使用编译期完全未知的类。反射机制可以在运行时动态的获取任意一个类的属性和方法,并可以对任意一个属性进行赋值,调用任意一个方法。(即便是私有方法,只要设置setAccessible)
2、反射作用
把java类中的各种结构(方法、属性、构造器、类名)映射成一个个的java对象。利用反射技术可以对一个类进行解刨,反射是框架设计的灵魂。另外,反射是程序运行时需要的,可以利用反射机制、字节码操作获得类似动态语言的特性。
3、反射实现
Class c=Class.forName(类路径(包括包名和类名))
这里的Class是java.lang.Class,十分特殊,用来标识java中类型。
注意:一个类只对应一个反射对象
获取反射对象的其他方法:
.class 获取反射对象
String.class 获取String类的反射对象
.getClass() 方法获取反射对象
而在获得反射对象之后,可以进而过得相应反射对象中的属性、方法以及构造器。
getFields() 只能获得public的field
getDeclaredFields() 获得所有的属性field
getDeclaredMethods() 获得所有的方法
getDeclaredMethod(方法名称,参数类型) 根据指定方法名称与方法中的参数类型获得 方法信息
如果方法有参数,则必须传递参数类型
如果方法五参数,参数类型为null
getDeclaredConstructors() 获得所有的构造器
getDeclaredConstructor(类型...) 通过传递构造器中参数的类型来获得制定的构造器
例:getDeclaredConstructor(int class, int class, int class);
通过反射创建新的类示例,有两种方式:
Class.newInstance() //此方法在最近版本的jdk已过时,如jdk1.9
Constructor.newInstance()
Class.newInstance() 抛出所有由被调用构造函数抛出的异常。
Class.newInstance() 要求被调用的构造函数是可见的,也即必须是public类型的;
Constructor.newInstance() 在特定的情况下,可以调用私有的构造函数。
通过反射API动态调用方法:
通过反射API操作属性
User u4 = clazz.newInstance();
Field f = clazz.getDelcaredField(“uname”);
f.set(u4,”lf”); // 通过反射直接写属性
Sytem.out.println(u4.getName());//输出结果一样 通过调用方法直接调用
Sytem.out.println(f.get(u4));//输出结果一样 通过发射进行调用
而如果uname是私有属性的话,上面操作就会报错,因为私有属性只有同一类才能访问,而其他类没有权限访问。
解决方法:
通过setAccessible(true) 声明该属性不用做安全检查,私有属性也可直接访问
User u4 = clazz.newInstance();
Field f = clazz.getDelcaredField(“uname”);
f.setAccessible(true);
f.set(u4,”lf”);
Sytem.out.println(u4.getName());//输出结果一样
Sytem.out.println(f.get(u4));//输出结果一样
setAccessible:
启用或禁用访问安全检查的开关。true:反射对象在使用时应该取消java语言访问检查。并不是为true就能访问,为false就不能访问。
禁止安全检查,可以提高反射的运行效率。
4、反射操作泛型

5、动态编译

