在静态方法URL.setURLStreamHandlerFactory的Java文档中,有一条警告“在给定的Java中最多可以调用一次此方法 虚拟机“。
我简要地查看了源代码,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只能调用一次这个方法?
答案 0 :(得分:5)
似乎没有确切的理由。
有趣的是,Eclipse" Runnable JAR文件导出器"功能会注册名为URLStreamHandlerFactory
的自定义RsrcURLStreamHandlerFactory
。
URLStreamHandlerFactory
本身包含另一个URLStreamHandlerFactory
,并提供方法setURLStreamHandlerFactory
来覆盖它。引用方法' javascript console:
允许添加另一个URLStreamHandler。 URL.setURLStreamHandlerFactory不允许 要添加多个工厂。 链式工厂被称为所有其他协议, 除了" rsrc"。使用null清除以前设置的Handler。
这个setURLStreamHandlerFactory
可以被多次调用,并且应该提供一些证据,证明更改处理程序不应该导致任何奇怪的行为。
更有趣的是,我发现了一个1998 JDK docs,因为应该允许多次调用setURLStreamHandlerFactory
,以便可以将多个处理程序链接在一起。功能请求已解析为 Future Project ,但显然从未实现过。