隐式加载:new
显示加载:loadClass,ForName等,需要调用 .newInstance() 获取实例,不支持传入函数,需要使用反射机制
-
类的装载过程
-
加载:通过classLoader加载class文件字节码,生成class对象。
链接:
检查:检查加载的class的正确性和安全性。
准备:为变量分配存储空间并设置变量初始化。
解析:执行变量赋值和静态代码块。
初始化:执行类变量复制和静态代码块。
loadClass(不会执行静态代码块):
ClassLoader cl = Student.class.getClassLoader();
forName(会执行静态代码块):
Class r = Class.forName("com.xiehe.qiluweb.entity.Student");
loadClass 和 forName 区别:
Class.forName: 得到的类是已经初始化的
loadClass:得到的Class是还没有链接的
loadClass:
如果 resolve 为true 会执行resolveClass 进行链接指定的这个类
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
forName:
第二个传入参数:true 为 initialize的值 是否进行初始化
@CallerSensitive
public static Class<?> forName(String className)
throws ClassNotFoundException {
Class<?> caller = Reflection.getCallerClass();
return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
}
应用举例:
forName:JDBC链接数据库的时候
loadClass:Spring IOC:资源加载器获取一些资源,及读取一些Bean的配置文件时,如果使用ClassPath,与LazyLoading 有关,加快加载速度,类的初始化到实际使用的时候在做。