美文网首页
2019-02-26一看你就懂,超详细java中的ClassLo

2019-02-26一看你就懂,超详细java中的ClassLo

作者: gdlooker | 来源:发表于2019-02-26 10:49 被阅读0次

参考大佬地址:
https://zhuanlan.zhihu.com/p/51374915 //重点看这篇
https://blog.csdn.net/briblue/article/details/54973413
个人研究部分ClassLoader源码如下:
ClassLoader这个类源码解析(源代码如下):

首先我们看下默认构造函数:

//这是默认的构造器
protected ClassLoader() {
       this(checkCreateClassLoader(), getSystemClassLoader());
   }

然后我们进入getSystemClassLoader()方法 代码如下:

 public static ClassLoader getSystemClassLoader() {
        initSystemClassLoader();  //这个是非常关键的  获取ClassLoader类
        if (scl == null) {
            return null;
        }
        SecurityManager sm = System.getSecurityManager();
        if (sm != null) {
            checkClassLoaderPermission(scl, Reflection.getCallerClass());
        }
        return scl;
    }

紧接着我们进入initSystemClassLoader我们翻开代码如下(私有的同步的静态方法):

private static synchronized void initSystemClassLoader() {
        if (!sclSet) {  //如果sclSet==false
            if (scl != null)
                throw new IllegalStateException("recursive invocation");
            sun.misc.Launcher l = sun.misc.Launcher.getLauncher(); //首先获取Laucher 这个就是获取外部类Launcher实例,通过这个实例来获取AppClassLoader内部类的实例
            if (l != null) {
                Throwable oops = null;
                scl = l.getClassLoader();// 原来是在这里获取ClassLoader实例的
                try {
                    scl = AccessController.doPrivileged(
                        new SystemClassLoaderAction(scl));
                } catch (PrivilegedActionException pae) {
                    oops = pae.getCause();
                    if (oops instanceof InvocationTargetException) {
                        oops = oops.getCause();
                    }
                }
                if (oops != null) {
                    if (oops instanceof Error) {
                        throw (Error) oops;
                    } else {
                        // wrap the exception
                        throw new Error(oops);
                    }
                }
            }
            sclSet = true;
        }
    }

总结:就是默认构建ClassLoader的实例的时候 从默认构造器里面获取了AppClassLoader的实例 它是通过
getSystemClassLoader方法来获取实例

相关文章

网友评论

      本文标题:2019-02-26一看你就懂,超详细java中的ClassLo

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