类加载方式loadClass和forName
- 隐式加载:
new
- 显式加载:
loadClass
,forName
等 需要调用class
的new instance()
生成对象实例
加载 :通过ClassLoader加载class文件字节码,生成Class对象
链接:
·校验:检查加载的class的正确性和安全性
·准备:为类变量分配存储空间并设置类变量初始值
·解析:JVM将常量池内的符号引用转换为直接引用
初始化:执行类变量赋值和静态代码块
Class.forName得到的class是已经初始化完成的
Classloder.loadClass得到的class是还没有链接的
package com.interview.javabasic.reflect;
public class LoadDifference {
public static void main(String[] args) throws ClassNotFoundException {
//ClassLoader cl = Robot.class.getClassLoader();
//Class r = Class.forName("com.interview.javabasic.reflect.Robot");
Class.forName("com.mysql.jdbc.Driver");
}
}
loadClass
我们也简要地去举个例子吧,spring ioc 在资源加载器获取要读入的资源的时候及读取一些bean的配置文件的时候呢?如果是你classpath的方式来,loadClass,这样做的原因是和spring ioc的lazy有关,我们延迟加载嘛,spring ioc,为了加快初始化速度,因此大量使用了延迟加载技术,而使用loadClass不需要执行类中的初始化代码、还有链接的步骤,加快加载速度把类的初始化工作,留到实际使用到这个累的时候才去做,一早存在即合理。