[英]Which classes are loaded by JVM but not a classloader?
我正在阅读Horstmann撰写的有关Core Java Volume 10中的断言的章节,其中说:
某些类不是由类加载器加载的,而是直接由虚拟机加载的。 您可以使用这些开关在这些类中有选择地启用或禁用断言。
我对此感到困惑,哪些类将由JVM而不是类加载器加载,我以为引导类加载器加载了初始类?
谢谢。
根据Oracle文档,没有类加载器的系统类是指位于rt.jar中并由引导类加载器加载的所有类。 因此,您不能访问提到的系统类的ClassLoader对象。
引导类加载器会加载系统类(通常从JAR文件rt.jar)。 它是虚拟机的组成部分,通常在C中实现。没有对应于引导类加载器的ClassLoader对象。 例如,
String.class.getClassLoader()
返回null。
最后,我们应该使用-enablesystemassertions / -esa开关来启用系统类中的断言。
所有Java虚拟机都包含一个嵌入在虚拟机中的类加载器。 该嵌入式加载程序称为原始类加载程序。 之所以有些特殊,是因为虚拟机假定它可以访问可信类的存储库,该类可以由VM运行而无需验证。
因此,如果我们编写如下代码:
Class r = loadClass(String className, boolean resolveIt);
这意味着类将在运行时由classLoader加载,并且JVM负责执行程序。
我希望你明白了!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.