// 源代码位置:
// openjdk8/hotspot/src/share/vm/classfile/systemDictionary.cpp
oop SystemDictionary::_java_system_loader = NULL;
java_system_loader属性用于保存应用类加载器实例,在compute_java_system loader()函数中初始化,调用链路如下:
// 源代码位置:
// openjdk8/jdk/src/share/bin/java.c
JavaMain()
InitializeJVM()
CreateJavaVM()
// 源代码位置:
// openjdk8/hotspot/src/share/vm/prims/jni.cpp
JNI_CreateJavaVM()
// 源代码位置:
// openjdk8/hotspot/src/share/vm/runtime/thread.cpp
Threads::create_vm()
// 源代码位置:
// openjdk8/hotspot/src/share/vm/classfile/systemDictionary.cpp
SystemDictionary::compute_java_system_loader()
compute_java_system_ loader()函数调用java.lang.ClassLoader类的getSystemClassLoader()方法,并将方法的返回值保存到_java_system_loader属性。
JavaClass::call_static()函数是HotSpot VM调用Java静态方法的API。
// 源代码位置:
// openjdk8/hotspot/src/share/vm/classfile/systemDictionary.cpp
void SystemDictionary::compute_java_system_loader(TRAPS) {
KlassHandle system_klass(THREAD, WK_KLASS(ClassLoader_klass));
JavaValue result(T_OBJECT);
JavaCalls::call_static(&result,
KlassHandle(THREAD, WK_KLASS(ClassLoader_klass)),
vmSymbols::getSystemClassLoader_name(),
vmSymbols::void_classloader_signature(),
CHECK);
_java_system_loader = (oop)result.get_jobject();
}
java.lang.ClassLoader类的getSystemClassLoader()方法如下:
public static ClassLoader getSystemClassLoader() {
initSystemClassLoader();
if (scl == null) {
return null;
}
return scl;
}
private static synchronized void initSystemClassLoader() {
//...
sun.misc.Launcher l = sun.misc.Launcher.getLauncher();
if (l != null) {
scl = l.getClassLoader();
}
//...
}
在initSystemClassLoader()方法中调用Launcher.getLauncher()方法获取Launcher对象,这个对象保存在jre\lib\rt.jar
中sum.misc.Lanucher类的launcher静态属性中。
public class Launcher {
private static Launcher launcher = new Launcher();
public Launcher() {
// 首先创建扩展类加载器ExtClassLoader
Launcher.ExtClassLoader var1;
try {
var1 = Launcher.ExtClassLoader.getExtClassLoader();
} catch (IOException var10) {
throw new InternalError("Could not create extension class loader", var10);
}
// 以ExtClassloader为父类加载器创建应用类加载器AppClassLoader
try {
this.loader = Launcher.AppClassLoader.getAppClassLoader