java 应用程序的入口是一个类的静态 main 方法. 启动一个 java 程序的命令如下所示:
java -classpath a.jar:b.jar com.example.App
jvm 启动时, 自动用 classpath 上的所有路径列表, 创建一个类加载器, 叫做系统类加载器. 然后用系统类加载器加载入口类, 并执行入口类的 main 方法. classpath 由 CLASSPATH 环境变量 和 -classpath 命令行参数合并产生. 运行时可以用 ClassLoader.getSystemClassLoader() 取到系统类加载器的实例.
CLASSPATH
-classpath
ClassLoader.getSystemClassLoader()
jvm 默认存在 3 个类加载器, 父委托关系如下:
"system class loader" -> "ext class loader" -> "bootstrap class loader"
java 应用程序无法取到启动类加载器 (bootstrap) 的引用, ClassLoader.getSystemClassLoader().getParent().getParent() == null. 运行程序:
ClassLoader.getSystemClassLoader().getParent().getParent() == null
package target; public class Test { public static void main(String[] args) throws Exception { ClassLoader sys = ClassLoader.getSystemClassLoader(); ClassLoader ext = sys.getParent(); ClassLoader boot = ext.getParent(); System.out.printf("sys: %s\next: %s\nboot: %s\n", sys, ext, boot); } }
可看到输出如下:
sys: sun.misc.Launcher$AppClassLoader@13e8d89 ext: sun.misc.Launcher$ExtClassLoader@1be2d65 boot: null
There was an error while loading. Please reload this page.