![49f85286f704d77af46d5e4b982449f1.png](https://i-blog.csdnimg.cn/blog_migrate/eb3ff41a507f5e3a13c70ac9b3d7be59.jpeg)
反射与RRTI
- 反射, 即提供运行时获取类信息, 调用方法等能力, 提供动态化功能; 可用于hook, 动态代理, 依赖注入等技术
- RRTI(Run-Time Type Identification)运行时类型识别, 作用是运行时识别一个对象的类型和类信息; 1). 传统的”RRTI”,它假定我们在编译期已知道了所有类型; 2). 反射机制,它允许我们在运行时发现和使用类型的信息
Class
对象的加载getClass()
, 会触发类的初始化阶段Class#forName()
, 会触发类的初始化阶段Class
字面常量, 即XXX.class
, 简单安全效率高, 但不会触发初始化ClassLoader#loadClass()
, 不会触发初始化
反射调用方法原理
- 首先Java通过字节码获取类的基本信息,其次通过Class#getMethod("myMethod")经过查找获取
Method
对象 - 接着通过
Method#invoke
调用方法, 此处包括Native版本和Java版本实现 - Native版本的
invoke0()
在HotSpot VM里是由JVM_InvokeMethod()
支持 JVM_InvokeMethod()</