在Java静态方法URL.setURLStreamHandlerFactory的文档中,有一个警告:“在给定的Java虚拟机中,此方法最多只能调用一次”。
允许多次调用此方法将导致覆盖此工厂实例变量,但我不明白为什么Java要阻止这种行为。
为什么Java要求每个JVM只能调用一次此方法?
我简要地查看了源代码,并且在URL类中有一个静态实例变量:
static URLStreamHandlerFactory factory;
而 setURLStreamHandlerFactory 仅仅是将工厂分配给这个变量:
public static void setURLStreamHandlerFactory(URLStreamHandlerFactory fac) {
synchronized (streamHandlerLock) {
if (factory != null) {
throw new Error("factory already defined");
}
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkSetFactory();
}
handlers.clear();
factory = fac;
}
}
允许多次调用此方法将导致覆盖此工厂实例变量,但我不明白为什么Java要阻止这种行为。
为什么Java要求每个JVM只能调用一次此方法?
URLClassLoader
类的存在和普遍使用有关。假设URLClassLoader
最终依赖于URL
来检索数据,我可以想象一旦设置后允许重新定义流处理程序工厂将会为颠覆应用程序提供一个可能的向量。 - John Bollinger