reflect反射

反射

什么是反射

  1. Java提供的API
    • 类和方法
  2. 其功能: 动态执行功能
    • 动态加载类
    • 动态创建对象
    • 动态访问属性, 执行方法
    • 动态解析 注解 等
  3. 反射是Java底层执行机制
  4. 几乎所有的框架底层都使用反射技术


静态执行

案例:

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 注解的方法







猜你喜欢

转载自blog.csdn.net/qq_41264674/article/details/80194871