标准ClassLoader类构造方法首个参数的作用是什么?
标准ClassLoader类构造方法的第一个参数作用是什么?
这个Void unused参数本质上是一个内部专用的占位符标记,主要有两个核心作用:
- 区分重载构造方法:ClassLoader类中存在其他构造方法(比如公开的
ClassLoader(ClassLoader parent)),这个私有构造方法通过添加一个Void类型的参数,让方法签名唯一,确保内部代码可以精准调用这个带有并行加载器初始化逻辑的构造分支,避免签名冲突。 - 明确内部调用语义:因为
Void类型在Java中只能传入null,这相当于给ClassLoader内部的调用者一个明确信号——这不是一个对外暴露的构造入口,而是用于类加载器初始化时的特殊流程分支。
结合你贴出的代码来看,这个私有构造方法是ClassLoader内部用来完成初始化的核心逻辑:
private ClassLoader(Void unused, ClassLoader parent) { this.parent = parent; if (ParallelLoaders.isRegistered(this.getClass())) { parallelLockMap = new ConcurrentHashMap<>(); package2certs = new ConcurrentHashMap<>(); domains = Collections.synchronizedSet(new HashSet<ProtectionDomain>()); assertionLock = new Object(); } else { // 无更细粒度锁;锁定类加载器实例 parallelLockMap = null; package2certs = new Hashtable<>(); domains = new HashSet<>(); assertionLock = this; } }
它会根据当前类加载器是否被注册为并行加载器,初始化不同的并发安全集合或普通集合,而Void unused参数就是为了让这个内部初始化逻辑的构造方法和其他公开构造方法区分开,同时限制只有类内部能调用它(毕竟是private修饰)。
内容的提问来源于stack exchange,提问作者Leonid Bor
相关产品推荐
相关产品推荐

