我只是在重新讨论JVM概念,并试图进行委托检查。考虑下面的代码
public class SrkDelegationDemo {
public static void main(String[] args) {
ClassLoader cl = ClassLoader.getSystemClassLoader();
while (true) {
System.out.println("ClassLoader is " + cl);
ClassLoader parent = cl.getParent();
if (parent == null) {
System.out.println("Last Classloader which has no parent = " + cl);
// This line should print Bootstrap
break;
}
cl = parent;
}
}
输出
ClassLoader是sun.misc.Launcher$AppClassLoader@ab770638
ClassLoader是sun.misc.Launcher$ExtClassLoader@75c10082
没有父代的最后一个类加载器= sun.misc.Launcher$ExtClassLoader@75c10082
从网上阅读的内容来看,我也期待BootstrapClassLoader,对此不确定。
我正在使用adopt-openjdk-with-openj9-jvm
,而JDK版本是jdk8u212-b03
答案 0 :(得分:2)
Bootstrap类加载器没有相应的java.lang.ClassLoader
对象;它的实现在JVM内部。否则,谁会加载java.lang.ClassLoader
类?
如ClassLoader.getParent
的规范所述,
某些实现可能使用null来表示引导类 装载机。在这种实现中,此方法将返回null 类加载器的父级是引导类加载器。
OpenJDK就是这样的实现。