0%

反射

反射

Class类

概念

  • Jvm为每一个加载到内存中的类都创建了一个特殊的Class类的实例
  • 相同的类有共同的Class实例

获得

  • 通过class的静态变量class获得
  • 通过实例的getClass方法获得
  • 通过Class的静态方法forName获得

概念

  • 类的Class实例包含的类的所有信息

  • 通过类对应的Class实例获得类和实例的信息即为反射

动态加载

  • 检查是否已经加载,有就直接返回,避免重复加载

  • 当前缓存中确实没有该类,那么遵循父优先加载机制,加载.class文件

  • 上面两步都失败了,调用findClass()方法加载

应用

访问字段

  • 获得特定实例的某个字段的值

    • 获得该实例对应的类对应的Class实例
    • 通过Class实例获得该字段对应的field实例
    • 通过field实例的方法get获得该类的实例的该字段的值
  • 修改特定实例的某个字段的值

    • 获得该字段对应的field实例
    • 通过field实例的set方法修改字段的值

访问方法

  • 获得方法的信息

    • 获得类对应的Class实例
    • 通过Class实例获得该方法对应的Method实例
  • 调用方法

    • 一般

      • 获得类对应的Class实例
      • 通过Class实例获得该方法对应的Method实例
      • 通过Method实例的invoke方法实现调用
    • 静态

      • 和“一般”的区别

        • invoke传入的实例参数为null
    • 构造

创建实例

  • Class.newInstance()可以调用class的public无参构造方法

应用场景

JVM创建实例

通过Class对象判断真正类型

Spring MVC自动组装

思维导图