反射
什么是反射
- Java提供的API
- 类和方法
- 其功能: 动态执行功能
- 动态加载类
- 动态创建对象
- 动态访问属性, 执行方法
- 动态解析 注解 等
- 反射是Java底层执行机制
- 几乎所有的框架底层都使用反射技术
静态执行
案例:
Foo foo = new Foo();
foo.test();
编译以后就确定了执行顺序: 先创建对象,然后执行方法, 在运行期间按照编译结果顺序执行. 称为静态执行.
动态执行
在运行期间才确定执行次序, 包括运行期间决定创建哪个对象, 运行期间决定调用哪个方法.
Java的动态执行功能, 需要利用反射API实现.
测试
动态加载类
在运行期间动态确定加载哪个类, 只加载一次(第一次会加载).
Class cls = Class.forName(类名)
动态创建对象
语法:
Object obj = cls.newInstance();
调用cls的类信息中的无参数构造器, 创建一个对象.
cls对应的类中包含无参数构造器 如果没有无参数构造器 抛出异常!
反射API可以调用有参数构造器(了解即可)
动态获取类中的方法信息
利用反射API, 获取一个类中声明的方法信息.
案例:
经典面试题目: Eclipse 动态联机助手(右键, 热键菜单) 用到了什么技术 如下图:
答案: 反射API实现的!
经典面试题目: 实现一个编程考试自动判卷功能.
答案: 反射API实现的!
利用反射调用方法:
执行 method 对应的方法, 对象是包含方法的对象, 参数是执行方法时候传递的参数, value 是方法执行以后的返回值
Object value=method.invoke(对象, 参数...)
invoke 调用
method 方法
案例:
1.动态加载类
2.动态创建对象
3、动态查找一个方法,按照方法名和参数类型查找
-找不到抛异常
4、动态调用一个方法
-参数错误抛异常
代码:无参
代码, 调用有参数方法:
利用反射执行私有方法(属性):
//打开方法访问限制
method.setAccessible(true);
利用反射解析 注解
Object obj = method.getAnnotation(注解类型)
Object obj = cls.getAnnotation(注解类型)
Object obj = field.getAnnotation(注解类型)
...
检查method上是否包含指定的注解, 如果返回null则不包含, 返回非空则包含指定注解.
JUnit 4 原型:执行一个类中全部标记 @Test 注解的方法