类加载机制(六):getSystemClassLoader与Launcher


title: 类加载机制(六):getSystemClassLoader与Launcher
date: 2019-03-19 16:09:38
categories:

  • Java虚拟机
    tags:
  • 类加载机制
  • Launcher类
  • getSystemClassLoader

getSystemClassLoader

在前文类加载机制(四):解析ClassLoader,我们分析了ClassLoader类的基本源码,了解了一个class文件是如何被加载到内存中的,也知道了Java应用默认是由系统类加载器加载的,那系统类加载器是由谁加载的、是如何加载的?我们通过贯穿ClassLoader类的一个静态方法getSystemClassLoader来对这些过程进行分析。

内部维护的字段
    // The class loader for the system
    // @GuardedBy("ClassLoader.class")
    private static ClassLoader scl;

    // Set to true once the system class loader has been set
    // @GuardedBy("ClassLoader.class")
    private static boolean sclSet;

ClassLoader内部维护了两个与加载系统类加载器相关的静态变量,从注释中我们可以看出scl就是用来接收系统类加载器的,而sclSet则是一个布尔值,用来判断scl是否为空的,关于系统类加载器基本都是操作这两个值的。

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

initSystemClassLoader

通过这个方法来初始化系统类加载器,只贴了主要代码。

   private static synchronized void initSystemClassLoader() {
   
       //若sclSet为真,则代表系统类加载已经被加载
        if (!sclSet) {
   
            if (scl != null)
                throw new IllegalStateException("recursive invocation");
            //创建一个Launcher,后文会讲
            sun.misc.Launcher l = sun.misc.Launcher.getLauncher();
            if (l != null) {
   
                Throwable oops = null;
                //通过Launcher类,获取系统类加载器
                scl = l.getClassLoader();
                try {
   
                    //判断是否有自定义类加载器
                    scl = AccessController.doPrivileged(
                        new SystemClassLoaderAction(scl));
                } catch (PrivilegedActionException pae) {
   
          
                }
            }
            //设置sclSet为真
            sclSet = true
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值