首页  

Class.forName()和ClassLoader.loadClass()的区别     所属分类 java 浏览量 1132
类装载过程

装载 通过类全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lang.Class对象

链接  (校验 准备 解析)  

   校验  检查类或接口的二进制数据的正确性(文件格式验证,元数据验证,字节码验证,符号引用验证) 
  准备  给类的静态变量分配并初始化存储空间
  解析 将常量池中的符号引用转成直接引用  

初始化  类静态变量初始化,静态代码块 


Class.forName(className) 内部调用  Class.forName(className,true,classloader)

第2个boolean参数表示类是否需要初始化
Class.forName(className) 默认进行初始化

初始化,执行 静态块代码块

ClassLoader.loadClass(className) 内部调用   ClassLoader.loadClass(className,false)

Class loadClass(String class_name, boolean resolve) throws ClassNotFoundException

false 不会进行初始化

测试例子代码
https://gitee.com/dyyx/hellocode/blob/master/src/dyyx/loadclass/Main.java


JDBC  
Class.forName(classname) 
com.mysql.jdbc.Driver

static {
    try {
        java.sql.DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
        throw new RuntimeException("Can't register driver!");
    }
}
类初始化 执行静态代码块 注册驱动

上一篇     下一篇
linux硬链接和软链接的区别

linux文件中的inode

log4j日志格式配置

getResource和getSystemResource的区别

spring常用注解

proc diskstats 字段说明