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

哪些类由JVM加载,而不是类加载器?

薛征
2023-03-14

我正在阅读Horstmann撰写的《Java核心》第10卷中关于断言的第四章,内容是:

有些类不是由类加载器加载的,而是由虚拟机直接加载的。您可以使用这些开关有选择地启用或禁用这些类中的断言。

我对此感到困惑,哪些类将由JVM加载,而不是由类加载器加载,我认为引导类加载器加载了初始类?

谢谢

共有2个答案

骆照
2023-03-14

所有Java虚拟机都包含一个嵌入到虚拟机中的类加载器。这个嵌入式加载器被称为原始类加载器。它有些特殊,因为虚拟机假定它可以访问可信类的存储库,这些存储库可以由VM运行而无需验证。

所以如果我们编写如下代码:

Class r = loadClass(String className, boolean resolveIt); 

这意味着类在运行时由类加载器加载,JVM负责执行程序。

我希望你明白了!

乐健
2023-03-14

根据Oracle文档,没有类加载器的系统类指的是位于rt.jar中并由引导类加载器加载的所有类。因此,您不能访问上述系统类的ClassLoader对象。

引导类加载器加载系统类(通常从JAR文件rt.JAR)。它是虚拟机不可分割的一部分,通常用C实现。引导类加载器没有对应的类加载器对象。例如

一串班getClassLoader()

返回null。

最后,我们应该使用-enablesystemassertions/-esa开关在系统类中启用断言。

 类似资料:
  • 主要内容:1.类加载过程,2.类加载时机,3.类加载器,4.类加载机制:当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化。 1.类加载过程 1.1加载 加载指的是将类的class文件读入到内存,并为之创建一个java.lang.Class对象,也就是说,当程序中使用任何类时,系统都会为之建立一个java.lang.Cl

  • 问题内容: 假设我有以下课程: 将执行此行: 导致JVM加载类,还是将类加载推迟到调用该方法之前? 问题答案: 仅当您需要有关该类的信息时才加载该类。 第(2)和(3)行将导致该类被加载。Something.class对象包含仅来自类定义的信息(第(2)行),因此您需要加载该类。对构造函数(3)的调用显然需要类定义。对于该类上的任何其他方法类似。 但是,第(1)行不会导致类被加载,因为您实际上不需

  • 如果我有一个内部类声明,例如: 其次是: A$B内部类也会加载吗?如果B内部类没有被声明为“静态”呢?

  • 问题内容: 我在其他地方找不到这个问题的明确答案,因此我将在这里尝试: 是否有某种方法(以编程方式或其他方式)来获取Application Classloader加载时所加载的JAR /类列表的确切顺序?应用程序类加载器,我是指在应用程序服务器(WLS,WAS,JBoss …)中加载EAR应用程序的类加载器,但显然,它适用于任何类加载器。 因此,概括地说,我想找出的是由指定类加载器加载的JAR的列

  • 主要内容:JVM架构图,1.类加载子系统作用,2.类加载器分类,3.双亲委派机制,4. 沙箱安全机制,5.其他JVM架构图 1.类加载子系统作用 类加载子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识; ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定 加载的类信息存放于一块成为方法区的内存空间。除了类信息之外,方法区还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是

  • 问题内容: 我整天都在这个问题上。我的问题是如何在实例上进行MethodHandle.invokeExact调用,该实例的类类型在程序运行时动态加载。为了使问题更清楚,我在下面显示我的示例代码: 在此示例中,expClass是动态加载的,其类类型为。下一行的obj实例被声明为BaseTemplate,其真实类型为。类AddSample是BaseTemplate的子类。然后,向其添加函数创建了一个M