我正在阅读如何加载类。似乎java.lang.ClassLoader的实例正在做这项工作。
但谁加载了java.lang.ClassLoader?
答案 0 :(得分:6)
想想我可以添加这个作为答案,这样人们就可以更容易地看到它......
java.lang.ClassLoader
是Java核心库的一部分(作为抽象类),Java提供的实现由JVM由引导类加载器加载。引导类加载器是用本机代码编写的,并在JVM启动时运行,以加载$JAVA_HOME/jre/lib
中的所有Java库
引用相关的维基百科条目:Java类加载器:
启动JVM时,使用三个类加载器:
- Bootstrap类装入器
- 扩展类加载器
- 系统类加载器
醇>bootstrap类加载器加载位于$ JAVA_HOME / jre / lib目录中的核心Java库。这个类加载器是核心JVM的一部分,是用本机代码编写的。
扩展类加载器加载扩展目录中的代码($ JAVA_HOME / jre / lib / ext,或java.ext.dirs系统属性指定的任何其他目录)。它由sun.misc.Launcher $ ExtClassLoader类实现。
系统类加载器加载在java.class.path上找到的代码,该代码映射到CLASSPATH环境变量。这是由sun.misc.Launcher $ AppClassLoader类实现的。
当您使用java -cp <some classes> my.package.MainClass
启动JVM时,上面提到的引导程序类加载器将以本机代码(作为JVM可执行文件的一部分)运行,以加载所有Java本机库。然后启动上面提到的类加载器链以加载在命令行和/或类路径参数中指定的任何剩余类。