反射的原理

1、Java 虚拟机可以通过称为运行时类型信息(RTTI, Run Time Type Information)的技术在运行时检查任何类,这是通过一种称为 Class 对象的特殊对象完成的,该对象包含有关类的信息。
2、虚拟机为每个类管理一个独一无二的 Class 对象。也就是说,每个类都有一个 Class 对象实例。在运行程序的时候,JVM 首先需要会去检测所需加载的类的 Class 是否已经完成加载。如果没有加载在 JVM 中,那么 JVM 回去寻找对应类名的 .class 文件,完成对 Class 对象的加载。通过 Class 对象,我们可以实例化对应的 Class 类对象,调用其构造器(Constructor)、调用类的成员方法(Method)、访问或者修改类的成员属性(Field)。通过 AccessibleObject#setAccessible(boolean flag) 可以访问到类的非 public 权限的其他成员,在上文提到通过 AccessibleObject#setAccessible(boolean flag) 可以在程序运行时修改类成员的访问限制。实际上,AccessibleObject#setAccessible(boolean flag) 关闭了权限的访问检查,使得通过 Class#invoke() 可以访问到任意权限的类成员

你可能感兴趣的:(反射的原理)