Java 反射机制原理
·约 895 字·2 分钟
AI摘要: 本文探讨了Java反射机制的原理,强调了其强大的运行时获取类信息的能力。文章首先介绍了基本的反射代码示例,然后深入分析了反射的实现过程,包括编译、加载和运行阶段。最后指出,由于Java中的对象创建机制涉及Class类对象存储类的具体信息,因此反射能够实现动态获取类信息。
如果说想找到一门将反射运用到极致的编程语言,那非Java莫属,其他语言中都没有如此广泛地运用反射机制,C++甚至都没有提供反射能力。反射强大的运行时获取类信息的能力为Spring框架提供了基础,AOP等机制都依赖于此,但是,我们似乎并没有深入理解反射这种能力从何而来,究竟如何实现的。
首先,基本的反射从如下代码得到:
Class class = Class.forName("polo.User")
User user = (User) class.newInstance();
// 或者采用构造器方法
Constructor constructor = class.getConstructor();
User user = (User) constructor.newInstance();
从上往下,我们看到是先得到Class对象,再通过Class对象的newInstance方法得到目标对象,因此这里就涉及到Java中的对象创建机制:
-
编译阶段:源代码.java —> 源代码.class,我们写的类代码会被编译成class字节码文件
-
加载阶段:当我们需要new一个对象的时候,JVM会先去加载这个类得到Class类对象,注意,这里的Class类对象还不是我们需要的对象,而是一个和源字节码一一对应的一个对象,存储着类的具体信息,比如有那些成员变量,有那些方法
-
运行阶段:这里才是真正new出我们需要的对象的阶段
正式因为我们的类信息会以Class类对象的方式存储着,所以Java才能在运行时动态获取到类的具体信息。
而Class类对象则存储在元空间中。
C++中因为没有为每个类保留元信息,也没有Class类对象,所以没有提供反射机制,如果想要实现,就得自己为每个类保留元信息。