JVM 类加载器_4(源码分析)

getSystemClassLoader()方法源代码解析

    public static ClassLoader getSystemClassLoader() {
   
        initSystemClassLoader();
        if (scl == null) {
   
            return null;
        }
        SecurityManager sm = System.getSecurityManager();
        if (sm != null) {
   
            checkClassLoaderPermission(scl, Reflection.getCallerClass());
        }
        return scl;
    }

    从上文可以看出调用了initSystemClassLoader方法。scl是一个ClassLoader对象的引用,下面是安全部分的代码,先跳过。那么我们就来看看initSystemClassLoader()方法做了什么事情。

    private static synchronized void initSystemClassLoader() {
   
        if (!sclSet) {
   
            if (scl != null)
                throw new IllegalStateException("recursive invocation");
            sun.misc.Launcher l = sun.misc.Launcher.getLauncher();
            if (l != null) {
   
                Throwable oops = null;
                scl = l.getClassLoader();
                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;
        }
    }

    sclSet是一个布尔类型的对象,表示scl是否被设置值。所以做了一个双重判断,sclSet为false的时候,scl应该是为空的。否则调用sun.misc.Launcher.getLauncher()方法获得Launcher的一个引用。我们待会再看这个方法。假设方法返回了一个Launcher对象,将Launcher中的ClassLoader成员变量赋值给了scl。并且在权限安全的情况下,new了一个SystemClassLoaderAction,传入了scl。最后把sclSet赋值为true。这个方法中有两个方法需要讲解,一个是sun.misc.Launcher.getLauncher()。另外一个是new SystemClassLoaderAction(scl)

    我们先来看看sun.misc.Launcher.getLauncher()

    ……
    private static Launcher launcher = new Launcher();
    ……
    public static Launcher getLauncher() {
   
        return launcher;
    }

    public Launcher() {
   
        Launcher.ExtClassLoader var1;
        try {
   
            var1 = Launcher.ExtClassLoader.getExtClassLoader();
        } catch (IOException var10) {
   
            throw new InternalError("Could not create extension class loader", var10);
        }

        try {
   
            this.loader = Launcher.AppClassLoader.getAppClassLoader(var1);
        } catch (IOException var9) {
   
            throw new InternalError("Could not create application class loader", var9);
        }

        Thread.currentThread().setContextClassLoader(this.loader);
        String var2 = System.getProperty
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值