类加载方式loadClass和forName

  • 隐式加载:new
  • 显式加载:loadClass , forName等 需要调用classnew 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不需要执行类中的初始化代码、还有链接的步骤,加快加载速度把类的初始化工作,留到实际使用到这个累的时候才去做,一早存在即合理。