当前位置: 首页 > 知识库问答 >
问题:

java中的classloader本身就是一个类,那么谁来加载classloader类呢?

百里成仁
2023-03-14

Java中的ClassLoader是一个用于在Java中加载类文件的类。

爪哇。ClassLoader是一个抽象类

这里我的问题是这个java。类加载器类与JVM的类加载器有任何关系(1.引导类加载器2.扩展类加载器3.系统类加载器)?

或者这个java。ClassLoader是一个单独的类,可用于创建自定义ClassLoader?

类加载器是Java运行时环境的一部分,它将Java类动态加载到Java虚拟机中。它负责定位库,读取那里的内容并加载库中包含的类。当JVM启动时,使用三个类加载器

>

  • Bootstrap类加载器

    扩展类加载器

    系统类加载器

    引导类加载器加载核心java库。它是用本机代码编写的。引导类加载器负责加载关键java类,如java。对象和其他运行时代码放入内存。运行时类打包在jre/lib/rt.jar文件中。

    扩展类加载器加载扩展目录中的代码。它由ExtClassLoader类实现。

    系统类加载器在java上找到的代码。班映射到系统类路径变量的路径。它由AppClassLoader类实现。默认情况下,所有用户类都由系统类加载器加载。

    Java类加载器是分层的,每当提出加载类的请求时,它都将类委托给其父类,这样在运行时环境中保持唯一性。如果父类加载器没有找到该类,则类加载器本身会尝试加载该类。

    这意味着第一个系统类加载器将请求委托给扩展类加载器,扩展类加载器将请求委托给引导类加载器,这里它将搜索类,如果找不到,那么扩展类加载器将搜索类,如果找不到,那么系统类加载器将搜索类如果未找到,则抛出ClassNotFoundExcure

    JVM总是从系统类加载器开始加载类吗?

    如果我哪里错了就纠正我

  • 共有1个答案

    麻超
    2023-03-14

    术语“系统类加载器”用词不当。正如您正确指出的,它负责从类路径的位置(即应用程序类)加载类。

    从Java开始

    每个运行时类都有一个定义类装入器。对于启动期间由引导加载程序定义的类,定义类加载程序是引导加载程序。当JVM初始化完成并尝试启动应用程序时,将查询应用程序类加载器(也称为系统类加载器)中的主类。应用程序类加载器将遵循先查询父类的标准委托模型,扩展类加载器也是如此,创建类的任何类加载器都将是类的定义类加载器。

    现在,当解析另一个类引用的类或调用Class.forName(String)时,包含引用的类的定义加载器将用于解析该类。因此,当Application类加载器加载了您的类myapp.foo.Bar并且它包含对javax.swing.JButton的引用时,它的定义类加载器,即Application类加载器,将被查询类,遵循委托模型,最终得到由Bootstrap加载器定义的javax.swing.JButton。因此,JButtonjavax.swing.中的类引用只能通过Bootstrap加载器来解析,这意味着html" target="_blank">javax.swing.JButton不能包含对您的myapp.foo.Bar类的引用,因为它不在范围内。

    因此,JVM并不总是以“系统类加载器”开始加载类,而是仅用于解析由它定义的类(或子加载器)的类引用,或者在显式查询时,如解析主类时。

    有一些第三方类加载器并不严格遵循父委托模型,但不管它们如何委托以及委托给哪个加载器,每个类都会有一个定义加载器(由getClassLoader()返回),该加载器将用于解析类内的引用。JVM确保一个类中相同的符号名始终解析为同一个运行时类,而不管特定的类加载器如何实现查找。

    注意,在Java中

     类似资料:
    • 问题内容: 如果我有一个内部类声明,例如: 其次是: A $ B内部类也将被加载吗?如果B内部类未声明为“静态”怎么办? 问题答案: 一旦代码被编译, 就没有内部类之类的东西 。如果查看的结果,则会看到两个文件: 因此,类在加载时不会加载,只是 碰巧 在中定义了。 编辑 例如,鉴于这两个文件, 和一个文件(为方便起见): 首先,通过运行进行构建。然后,解压缩生成的JAR文件(位于中): 打开每个文

    • CLMAIN->clA(类A,$B)。$B是类a的内部类B。 从clMain创建具有指定url的新clA到包含类A(和类$B)的jar文件。然后通过CLA创建新对象A。 从X加载的另一个类通过接口执行对象a的方法没有问题。 然后,在该方法中,应该创建新对象$b,但它抛出. 在类A的构造函数中加载类$B可以解决以下问题:

    • 问题内容: 我有一个加载从源文件编译的类。但是,当我更改源文件,保存并重新编译它时,仍然会加载该类的第一个版本。 我想念什么?像newInstance之类的东西? 问题答案: 类加载器不能替换已经加载的类。将返回现有实例的引用。 您必须实例化一个新的类加载器,并使用它来加载新类。然后,如果要“替换”该类,则必须扔掉该类加载器并创建另一个新的类加载器。 针对您的评论:做类似的事情 该类加载器将使用“

    • 本文向大家介绍classloader类加载器_基于java类的加载方式详解,包括了classloader类加载器_基于java类的加载方式详解的使用技巧和注意事项,需要的朋友参考一下 基础概念 Classloader 类加载器,用来加载 Java 类到 Java 虚拟机中。与普通程序不同的是。Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机

    • 问题内容: 简单地说,什么是Java ClassLoader?何时使用Java?为什么? 好的,我读了一篇维基文章。ClassLoader加载类。好。因此,如果我包含jar文件并导入,则ClassLoader可以完成这项工作。 我为什么要打扰这个ClassLoader?我从未使用过它,也不知道它的存在。 问题是,为什么ClassLoader类存在?而且,您如何在实践中使用它?(案例存在,我知道。)

    • 问题内容: 动机 假设我们有一个如下所示的类加载层次结构: 假设Classloader用于加载类。它检查类加载器是否可以加载它,再次检查类加载器是否可以加载它。由于两者都不能,所以由classloader加载。 任何依赖的类都是一样的。我相信我了解这一过程。 题 我不明白为什么会尝试首先加载。在Java应用程序中如何选择当前的类加载器? 问题答案: 如您所知,默认情况下,Java使用引导类加载器和