第一次接触Class类是在学习 jdbc中。Class.forName()是Class类的一个静态方法,用于手动加载一个类,例如数据库驱动。
其实每一个java类都拥有或者说对应一个Class的实例对象,有的教程解释“万物皆对象”时会说类是Class类的对象(那么Class本身呢)。每个java类对应的class对象就是生成的同名class文件。Class的主要作用是用于获取类的信息,如成员变量/方法/构造等等,他保存类的结构。
当一个类在被使用时:使用其静态方法或者实例化其对象时需要经过几个步骤:加载、连接、初始化。JVM在加载一个类时,加载其字节码文件,生成对应Class对象。在连接过程中,首先验证class文件的完好性,为类的静态字段准备好内存区域,随后解析该对象。最后初始化类,如执行静态语句块,初始化静态成员变量。
值得注意的是加载、连接、初始化之间并不连续。所以对于动态加载和静态加载的区别也比较容易得到完全是加载的时机的问题(静态加载还会再编译时检查类的完好性)。有一份代码可以证明这点。JVM是在类被使用时才正式加载一个类,JVM在类首次使用时动态的加载、链接和初始化