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

JVM*_*JVM 5 java jvm classloader

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

java.lang.ClassLoader是一个抽象类

在这里,我的问题是,此java.lang.ClassLoader类是否与JVM的类加载器有关(1. Bootstrap类加载器2.扩展类加载器3.系统类加载器)?

还是此java.lang.ClassLoader是可用于创建自定义类加载器的单独类?

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

  1. 引导类加载器

  2. 扩展类加载器

  3. 系统类加载器

Bootstrap类加载器加载核心Java库。它是用本机代码编写的。引导类加载器负责将关键的Java类(如java.lang.Object)和其他运行时代码加载到内存中。运行时类打包在jre / lib / rt.jar文件中。

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

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

Java ClassLoader是分层的,每当引发请求以加载类时,它就会将其委派给其父级,并以此方式在运行时环境中保持唯一性。如果父类加载器找不到该类,则该类加载器本身将尝试加载该类。

因此,这意味着首先系统类加载器会将请求委派给扩展类加载器,而扩展类加载器会将请求委派给Bootstrap类加载器,如果找不到该类,它将搜索类,然后扩展类加载器将搜索类(如果找不到),然后系统类加载器将搜索类如果未找到,则抛出ClassNotFoundException

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

纠正我,如果我在任何地方错了

Hol*_*ger 5

术语 \xe2\x80\x9cSystem class loader\xe2\x80\x9d 是一个用词不当。正如您所说,它\xe2\x80\x99 负责从类路径的位置加载类,即应用程序类。

\n\n

从 Java\xc2\xa08 开始, 和AppClassLoader都是ExtClassLoader的子类java.net.URLClassLoader, 是 的子类java.security.SecureClassLoader, 是 的子类java.lang.ClassLoader。所有这些类都由 Bootstrap 加载器加载,解决了先有鸡还是先有蛋的问题。

\n\n

每个运行时类都有一个定义类加载器。对于那些在启动期间由 Bootstrap 加载器定义的类,定义类加载器是 Bootstrap 加载器。当 JVM 初始化完成并尝试启动应用程序时,将查询应用程序类加载器(又名系统类加载器)以获取主类。应用程序类加载器将遵循标准委托模型首先查询父级,扩展类加载器也是如此,并且无论哪个类加载器创建该类都将是 class\xe2\x80\x99 定义类加载器。

\n\n

现在,当解析另一个类引用的类或Class.forName(String)调用时,包含引用的类的定义加载器将用于解析该类。因此,当应用程序类加载器加载了您的类myapp.foo.Bar并且它包含对 的引用时,javax.swing.JButton将查询其定义类加载器(即应用程序类加载器)以查找该类,遵循委托模型最终得到javax.swing.JButton引导加载器定义的类。因此,其中的类引用javax.swing.JButton只能通过引导加载程序解析,这意味着javax.swing.JButton不能包含对myapp.foo.Bar类的引用,因为它不在范围内。

\n\n

因此,JVM并不总是以 \xe2\x80\x9cSystem class loader\xe2\x80\x9d 开头来加载类,而是仅用于解析由它(或子加载器)定义的类的类引用或显式查询时,就像解析主类时一样。

\n\n

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

\n\n

请注意,在 Java\xc2\xa09 中,Extension 类加载器已被 Platform 类加载器取代。该类加载器可能偏离简单的父委托,即,它可能委托给应用程序类加载器来加载取代平台提供的模块的应用程序提供的模块。此外,内置类加载器不再是 的子类URLClassLoader

\n