java文件的类加载机制:
jvm将描述类的数据从class文件加载到内存,然后对数据进行校验,解析以及初始化,在java虚拟机中形成可以直接使用的java类型。
java类文件的加载是动态的。
java为我们提供了2种类文件加载的动态机制。
1.隐式加载---- new一个对象+调用一个类的静态方法
2.显示加载----(1)java.lang.Class的forName方法加载
(2)java.lang.ClassLoad的loadClass方法加载
接下来我们来比较下显示加载的2个方法:
1.java.lang.Class的forName方法加载
class.forName 有2个重载方法
public static Class forName(String className)public static Class forName(String className, boolean initialize,ClassLoader loader)
className: 类的完全限定名
initialize:是否初始化类(初始化类中的静态代码块)
loader:加载类的类加载器
说明:
调用forName(className) 相等于forName(className, true,loader)
这两个方法最终都会走到
private static native Class<?> forName0(String name, boolean initialize, ClassLoader loader, Class<?> caller)
这个方法里。
1.java.lang.ClassLoad的loadClass方法加载
- Classloder.loaderClass(String name)
方法内部调用的是:Classloder. loadClass(name, false)
方法:Classloder. loadClass(String name, boolean resolve)
1:参数name代表类的全限定类名
2:参数resolve代表是否解析,resolve为true是解析该类
两者最大的区别:class.forName 得到的class是已经初始化的,而Classloder.loaderClass是还没有链接的。
最常用的就是:mysql驱动器的加载
Class.froName(“com.mysql.jdbc.Driver”),
看看源码就知,在获取Driver时,需要初始化静态代码块
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
public Driver() throws SQLException {
} <br>
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can\'t register driver!");
}
}
}