标准 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()
方法?
标题说明了一切,这是代码:
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()
方法?