Class类是什么?类的.class哪儿来的?
文章目录
众所周知,在磁盘中的"类名.class"文件是该类的源代码编译后的类的字节码文件。
当程序启动,如果主动调用这个类的成员方法或者属性,且这个类之前没有被Load,那么这个类就会被主动Load进虚拟机。
(作为静态常量池的一员)
问题1
那么,在程序中,通过"类名.class"获得的Class类对象又是什么呢?
- 是这个类的静态成员属性?
那为什么在任何类甚至Object类里面都找不到这个属性呢?
我们点开Class类的源码,看怎么说。
其中第二段提到:
Class has no public constructor. Instead Class objects are constructed automatically by the Java Virtual Machine as classes are loaded and by calls to the defineClass method in the class loader.
Class类并没有构造器(constructor)。相反,当一些类被加载的时候,Class类会被虚拟机(java Virtual Machine)通过ClassLoder 调用 the defineClass 方法自动构造。
由此,我的理解是,当要加载一些类(比如说String)的时候,JVM就会自动构造生成对应的Class类,通过调用自动生成的这个Class类来定义被加载的类。
(比如说加载String,JVM会先自动构造String的Class类,然后String的Class类定义String有什么成员变量、成员方法、构造方法)
最后,所谓的.class就是被加载的那个类在加载完成后,JVM提供的一个指向定义那个类的Class类的引用。
至此,问题1基本解决了。