ClassLoader类加载器、双亲委派模型

    xiaoxiao2024-11-14  67

    ****** *1.ClassLoader 类加载器 ********* 1.1定义: 类加载定义:通过一个类的全名称来获取此类的二进制字节流 类加载器:实现类加载功能的代码模块

    1.2JDK内置的三大类加载器 1.2.1BootStrapClassLoader(启动类加载器,c语言实现的加载器) I.使用C++语言实现,是JVM自身的一部分,独立于JVM外部,并且无法被java程序直接引用。 II.负责将存放于JAVA_HOME\lib目录下的能被JVM识别的所有类库(例如rt.jar-java基础类库)加载到JVM中。 1.2.2ExtClassLoader(扩展类加载器) I.使用java语言实现,可以被java程序直接调用 II.负责将存放于JAVA_HOME\lib\ext(xml文件解析类、界面框架类)目录下的所有能被JVM是别的类库 1.2.3 APPClassLoader(应用程序类加载器) I.使用Java程序实现,如果用户没有自定义类加载器,则APPClassLoader就是程序中默认的类加载器 II.负责加载用户classPath指定的类库

    System.out.println(cls.getClassLoader()); System.out.println(cls.getClassLoader().getParent()); System.out.println(cls.getClassLoader().getParent().getParent()); 输出结果: sun.misc.Launcher$AppClassLoader@18b4aac2 sun.misc.Launcher$ExtClassLoader@1540e19d null

    1.3类加载器的双亲委派模型(定义、工作流程、存在意义) 1.3.1定义: 四种类加载器的层次关系称为类加载器双亲委派模型 我们使用的应用程序都是由这三种加载器相互配合进行加载,如果有必要,还可以加入自定的类加载器。这些类的加载关系如图所示: 1.3.2 工作流程 如果一个类加载器收到了类加载请求,首先自己不会去尝试加载此类,而是将类加载请求委托给父类加载器完成,每一层的类加载器都是如此。只有当父加载器无法加载此类时,子加载器才会尝试自己去加载。 1.3.3存在意义: 双亲委派模型对于保证java程序的稳定运行十分重要。例如java.lang.Object,它存放在rt.jar中,由于双亲委派模型的存在,无论哪一类加载器要加载此类,最终都是为派给处于顶端的启动类加载器进行加载。因此,Object类在程序的各种类加载器环境中都是同一个类。

    1.4比较两个类是否相等? 比较两个类相等的前提:必须是由同一个类加载器加载的前提下才有意义。否则,即使两个类来源于同一个Class文件,被同一个虚拟机加载,只要加载它们的类加载器不同,那么这两个类就一定不相等。

    最新回复(0)