加载一个 class 文件的分为 3 步
- 装载:查找相应的class文件并装载二进制数据。
- 连接:执行验证,准备,以及解析(可选)
- 验证:确保被导入类型的正确性
- 准备:为类变量分配内存,并将其初始化为默认值
- 解析:把类型中的符号引用转化为直接引用
- 初始化:激活类的静态变量、初始化 Java 代码、执行静态代码块
loadClass() 和 Class.forName() 的区别
- loadClass(className): 它调用的方法是它的重载方法 ClassLoader.loadClass(String name,boolean resolve) ; 如果 resolve 为 false 则表示目标对象被装载后不进行链接,这就意味这不会去执行类的连接和初始化。缺省该参数时为 false。注意:resolve=true 时,则保证已经装载,而且已经连接了。resolve=false 时,则仅仅是去装载这个类,不关心是否连接了,所以此时可能被连接了,也可能没有被连接(假如之前这个类被同一个 classLoad 加载并初始化了,那么将返回之前初始化过的类);
- Class.forName(className) : 它调用的是它的重载方法 Class.forName(String name,boolean initialize,ClassLoader loader); 如果 resolve 为 true, 则在加载类之后执行初始化操作。缺省该参数时为 ture。注意 resolve = false 时,则不会初始化,但是不关心是否被连接。(假如之前这个类被同一个 classLoad 加载并初始化了,那么将返回之前初始化过的类);
关键字 new 和 Class.newInstance()的区别
- new : 强类型,相对高效,能调用任何public构造。
- newInstance : 弱类型,低效,只能调用无参构造。但是更灵活