美文网首页
ClassLoader-3 Main方法执行

ClassLoader-3 Main方法执行

作者: 01010100 | 来源:发表于2018-02-27 19:30 被阅读104次

    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

    相关文章

      网友评论

          本文标题:ClassLoader-3 Main方法执行

          本文链接:https://www.haomeiwen.com/subject/gxnmxftx.html