反射
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自动组装
思维导图
