标准 ClassLoader class 构造函数的第一个参数是什么?

What is the first parameter of standard ClassLoader class constructor for?

标题说明了一切,这是代码:

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 {
        // no finer-grained lock; lock on the classloader instance
        parallelLockMap = null;
        package2certs = new Hashtable<>();
        domains = new HashSet<>();
        assertionLock = this;
    }
}

在实例化 class 加载程序之前调用安全检查似乎是一个聪明的技巧。

快速实验确认在任何初始化程序之前调用静态方法:

public class InitializerTest {
    {
        System.out.println("Initializer block");
    }

    private InitializerTest(Void v) {
        System.out.println("Constructor");
    }

    protected InitializerTest() {
        this(staticMethod());
    }

    private static Void staticMethod() {
        System.out.println("Static method");
        return null;
    }
}

输出:

Static method
Initializer block
Constructor

显然,绝不允许实例化流氓 ClassLoader subclass 比实例化后失败更安全。例如。即使 superclass 在它的第一个初始化块中失败了,实例就在那里 - 也许可以利用 subclass 上的 finalize() 方法?