💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
### 类加载的时机 * 隐式加载 new 创建类的实例, * 显式加载:loaderClass,forName等 * 访问类的静态变量,或者为静态变量赋值 * 调用类的静态方法 * 初始化某个类的子类 * 使用反射方式创建某个类或者接口对象的Class对象 * 直接使用`java.exe`命令来运行某个主类 ### 类加载过程 加载->验证->准备->解析->初始化 ![](https://img.kancloud.cn/ff/32/ff32d2c3025387bc61fc1c307266bff3_602x435.png) - **加载** 类加载过程的一个阶段,ClassLoader通过一个类的完全限定名查找此类字节码文件,并利用字节码文件创建一个class对象。 - **验证** 目的在于确保class文件的字节流中包含信息符合当前虚拟机要求,不会危害虚拟机自身的安全,主要包括四种验证:文件格式的验证,元数据的验证,字节码验证,符号引用验证。 - **准备** 为类变量(static修饰的字段变量)分配内存并且设置该类变量的初始值,(如static int i = 5 这里只是将 i 赋值为0,在初始化的阶段再把 i 赋值为5),这里不包含final修饰的static ,因为final在编译的时候就已经分配了。这里不会为实例变量分配初始化,类变量会分配在方法区中,实例变量会随着对象分配到Java堆中。 - **解析** 这里主要的任务是把常量池中的符号引用替换成直接引用 - **初始化** 这里是类记载的最后阶段,如果该类具有父类就进行对父类进行初始化,执行其静态初始化器(静态代码块)和静态初始化成员变量。(前面已经对static 初始化了默认值,这里我们对它进行赋值,成员变量也将被初始化) * [ ] 双亲委派模式 如果一个类收到了类加载的请求,它并不会自己先去加载,而是把这个请求委托给父类加载器去执行,如果父类加载器还存在父类加载器,则进一步向上委托,依次递归,请求最后到达顶层的启动类加载器,如果弗雷能够完成类的加载任务,就会成功返回,倘若父类加载器无法完成任务,子类加载器才会尝试自己去加载,这就是双亲委派模式。就是每个儿子都很懒,遇到类加载的活都给它爸爸干,直到爸爸说我也做不来的时候,儿子才会想办法自己去加载。 ![](https://img.kancloud.cn/6e/b5/6eb5502df1b2a705cc2815293ccfcda8_1240x882.png) * [ ] 自定义类加载器 一般需要继承java.lang.ClassLoader类并重写其findclass方法。 ***** 引用自 https://www.cnblogs.com/czwbig/p/11127222.html https://blog.csdn.net/weixin_40236948/article/details/88072698