定义

反射机制:动态获取的信息以及动态调用对象的方法的功能。
指在运行状态中

  • 对任意一个类,都能够知道这个类的所有属性和方法
  • 对任意一个对象,都能调用这个对象的所有属性和方法

    分类

    静态编译和动态编译

  • 静态编译:在编译时确定类型,绑定对象

  • 动态编译:运行时确定类型,绑定对象

    作用

    - 检查类的属性和方法

  • 在运行时检查对象的类型

  • 动态构造某个类的对象
  • 可以任意调用对象的方法

    应用场景

    反射是框架设计的灵魂。
    在我们平时的项目开发过程中,基本上很少会直接使用到反射机制,但这不能说明反射机制没有用,实际上有很多设计、开发都与反射机制有关,例如模块化的开发,通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制,还有我们日常使用的 Spring/Hibernate 等框架也大量使用到了反射机制。

举例:
1. 我们在使用JDBC连接数据库时使用Class.forName()通过反射加载数据库的驱动程序;
2. Spring框架也用到很多反射机制,最经典的就是xml的配置模式。Spring 通过 XML 配置模式装载 Bean 的过程:
a. 将程序内所有 XML 或 Properties 配置文件加载入内存中;
b. Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息;
c. 使用反射机制,根据这个字符串获得某个类的Class实例;
d. 动态配置实例的属性

获取反射

  1. 通过new对象实现反射机制
  2. 通过路径实现反射机制
  3. 通过类名实现反射机制

    1. public class Student {
    2. private int id;
    3. String name;
    4. protected boolean sex;
    5. public float score;
    6. }
    7. public class Get {
    8. //获取反射机制三种方式
    9. public static void main(String[] args) throws ClassNotFoundException {
    10. //方式一(通过建立对象)
    11. Student stu = new Student();
    12. Class classobj1 = stu.getClass();
    13. System.out.println(classobj1.getName());
    14. //方式二(所在通过路径-相对路径)
    15. Class classobj2 = Class.forName("fanshe.Student");
    16. System.out.println(classobj2.getName());
    17. //方式三(通过类名)
    18. Class classobj3 = Student.class;
    19. System.out.println(classobj3.getName());
    20. }
    21. }

    使用反射

  4. java.lang.reflect 包中的三个类

    • Field:成员变量
    • Method:成员方法
    • Constructor:构造方法
  5. 对 public 域的方法

包括父类成员。

  • getField
  • getMethod
  • getConstructor
    1. 对其他域的方法

包括 private 和 protected 的成员,但不包括父类成员。

  • getDeclaredField
  • getDeclaredMethod
  • getDeclaredConstructor

利用反射访问私有属性:使用 setAccessible(true)

优缺点

优点:运行期类型的判断,动态加载类,提高代码灵活度。
缺点:性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的java代码要慢很多。