Main方法执行
@see http://blog.csdn.net/roger__wong/article/details/39900717
@see http://blog.csdn.net/ROger__wonG/article/details/39972585
首先应该对java命令有大概了解,是由C实现的,这里不作具体描述,参考上述文章。
从java相关开始说起。
Java.c中的LoadMainClass,该方法负责加载main函数所在的类。
该方法首先加载sun.launcher.LauncherHelper类,然后调用该类的checkAndLoadMain去加载main函数所在的类。
LauncherHelper
checkAndLoadMain( .., int mode, String what) {
// mode决定是直接传入的是主类还是jar文件,即区分java -jar xxx.jar 还是 java xxx.class
final ClassLoader ld = ClassLoader.getSystemClassLoader();
Class c = ld.loadClass(cn);
...
}
ClassLoader
getSystemClassLoader {
initSystemClassLoader();
return scl;
}
initSystemClassLoader{
sun.misc.Launcher l = sun.misc.Launcher.getLauncher();
scl = l.getClassLoader();
}
Launcher
getLauncher -> new Launcher()
{
localExtClassLoader = ExtClassLoader.getExtClassLoader();
this.loader = AppClassLoader.getAppClassLoader(localExtClassLoader);
Thread.currentThread().setContextClassLoader(this.loader);
}
public ClassLoader getClassLoader() {
return this.loader;
}
1、从这里可以看出加载main方法类的加载器是系统类加载器,而系统类加载器其实就是AppClassLoader
所以,main方法默认加载器是AppClassLoder,并且传给当前线程上下文的加载器也是AppClassLoader
2、AppClassLoader/ExtClassLoader都是Launcher的内部类。先初始化ExtClassLoader,并将ExtClassLoader作为父加载器传给AppClassLoder
网友评论