Tldr:
§ ..该属性的值被视为将作为系统类加载器返回的类的名称。使用默认系统类加载器..
加载该类
..因此,如果您的类加载器将 X 替换为系统类加载器,那么您的类加载器的父级将是 X,即默认的系统类加载器。
(X 的类型类似于sun.misc.Launcher$AppClassLoader。)
更多信息可以在docs.oracle.com - How the Java Launcher Finds Classes找到:
Java 启动器 java 启动 Java 虚拟机。这
虚拟机按以下顺序搜索和加载类:
Bootstrap 类 - 构成 Java 平台的类,包括 rt.jar 和其他几个重要 jar 文件中的类。
扩展类 - 使用 Java 扩展机制的类。这些被捆绑为位于扩展目录中的 .jar 文件。
用户类 - 由开发人员和第三方定义的不利用扩展机制的类。你确定
这些类的位置使用 -classpath 选项
命令行或使用 CLASSPATH 环境变量。
Tsmr:
我们可以证明X确实是我们Classloader的父级:
/** run with -Djava.system.class.loader=MyCL to use this classloader */
public class MyCL extends ClassLoader {
public MyCL(ClassLoader parent) { // this constructor must be public, else IllegalAccessException
super(parent);
}
}
这是我们的主要代码:
public class Main {
public static void main(String args[]) {
System.out.println("getSystemClassLoader(): " + ClassLoader.getSystemClassLoader());
ClassLoader cl = MyCL.class.getClassLoader();
System.out.println("Classloader of MyCL: " + cl);
Class type_of_cl = cl.getClass();
System.out.println("..and its type: " + type_of_cl);
ClassLoader cl_of_cl = class_of_cl.getClassLoader();
System.out.println("Classloader of (Classloader of MyCL): " + cl_of_cl);
}
}
这是使用命令java -Djava.system.class.loader=MyCL Main(参见Eclipse run config)运行时的输出(在我的系统上):
getSystemClassLoader(): MyCL@1888759
MyCL 的类加载器:sun.misc.Launcher$AppClassLoader@7fdcde
..及其类型:类 sun.misc.Launcher$AppClassLoader
(MyCL的Classloader)的类加载器:null
我们可以看到MyCL的类加载器是sun.misc.Launcher$AppClassLoader,这是系统默认的类加载器。
(根据上面 Oracle 的其他引用中所见的语言,默认系统类加载器也称为“用户类”的类加载器。为同一件事想出 2 个名称的 Oracle。 )