Class.forName()和ClassLoader.loadClass()的区别
所属分类 java
浏览量 1348
类装载过程
装载 通过类全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成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 字段说明