类加载阶段:加载、链接(验证、准备、解析)、初始化、使用、卸载
结论
Class.forName
和ClassLoader
都可以对类进行加载Class.forName
加载类需要依赖ClassLoader
ClassLoader.loadClass
只是加载类,不会触发类的初始化。可用于懒加载场景,提高系统启动速度Class.forName
加载类之后会触发类的初始化
Class.forName
Class.forName
除了将类的class文件加载到jvm中(从下图可以看到Class.forName
也是使用ClassLoader
加载类的),还会触发类的初始化(执行静态代码块以及静态变量赋值)
虽然forName0
方法并未对该参数进行解释,但是从Class#forName(java.lang.String)
的重载方法Class#forName(java.lang.String, boolean, java.lang.ClassLoader)
可知该参数的作用,经验证,当initialize
值为false时,并不会触发类的初始化
测试
结果
ClassLoader
ClassLoader
使用双亲委派模型加载类,不进行初始化。
ClassLoader.loadClass
方法不需要类加载过程中的链接和初始化过程,这样可以有效的加快速度,把类的初始化工作留到实际使用时才触发。例如Spring IOC中大量使用了延迟加载技术
测试
执行结果