1.封装Vue组件的一些技巧(5000)第一
534 2023-04-03 03:18:18
类的加载流程包含:加载、验证、准备、解析、初始化
作为第一个阶段,虚拟机需要完成了以后三个步骤
将类中的符号引用转换为直接引用
解析阶段就是虚拟机将常量池内符号引用替换为直接引用,解析的动作主要是针对类的接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用进行。
为类的静态变量赋予正确的初始值,到了初始阶段,才开始真正执行类中定义的Java程序代码。
示例图
==注意:这里父类加载器并不是通过继承关系来实现的,而是采用组合实现的==
在java虚拟机的角度来说只存在两种不同的类加载器
在开发者的角度来说,类的加载器可以大致划分为三类
类加载的方式
双亲委派机制的流程:如果一个类加载器收到了一个类加载的请求,首先他不会尝试自己加载该类,而是把这个请求委托给父类加载器加载该类,依次向上传递,因此,所有的类记载请求都会请求到启动类加载器中,父类加载器在他的搜索范围内没有找到所需要的类时,即无法完成该类的加载,子加载器才会尝试自己去加载该类,如果还没有找到,那么直接抛出异常
示例流程详解
双亲委派机制的意义
代码示例
// 首先判断该类型是否已经被加载 Class<?> c = findLoadedClass(name); if (c == null) { long t0 = System.nanoTime(); try { //如果没有被加载,就委托给父类加载或者委派给启动类加载器加载 if (parent != null) { //如果存在父类加载器,就委派给父类加载器加载 c = parent.loadClass(name, false); } else { //如果不存在父类加载器,就检查是否是由启动类加载器加载的类,通过调用本地方法native Class findBootstrapClass(String name) c = findBootstrapClassOrNull(name); } } catch (ClassNotFoundException e) { // ClassNotFoundException thrown if class not found // from the non-null parent class loader }
通常情况下,我们都是直接使用系统类加载器。但是,有的时候,我们也需要自定义类加载器。比如应用是通过网络来传输 Java类的字节码,为保证安全性,这些字节码经过了加密处理,这时系统类加载器就无法对其进行加载,这样则需要自定义类加载器来实现。自定义类加载器一般都是继承自 ClassLoader类,从上面对 loadClass方法来分析来看,我们只需要重写 findClass 方法即可。
自定义类加载器的核心在于对字节码文件的获取,如果是加密的字节码则需要在该类中对文件进行解密