为什么Java要求“在给定的Java虚拟机中最多可以调用一次此方法”?

时间:2015-06-23 18:23:51

标签: java jvm

在静态方法URL.setURLStreamHandlerFactory的Java文档中,有一条警告“在给定的Java中最多可以调用一次此方法 虚拟机“。

http://docs.oracle.com/javase/7/docs/api/java/net/URL.html#setURLStreamHandlerFactory(java.net.URLStreamHandlerFactory)

我简要地查看了源代码,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只能调用一次这个方法?

1 个答案:

答案 0 :(得分:5)

似乎没有确切的理由。

有趣的是,Eclipse" Runnable JAR文件导出器"功能会注册名为URLStreamHandlerFactory的自定义RsrcURLStreamHandlerFactoryURLStreamHandlerFactory本身包含另一个URLStreamHandlerFactory,并提供方法setURLStreamHandlerFactory来覆盖它。引用方法' javascript console

  

允许添加另一个URLStreamHandler。   URL.setURLStreamHandlerFactory不允许   要添加多个工厂。   链式工厂被称为所有其他协议,   除了" rsrc"。使用null清除以前设置的Handler。

这个setURLStreamHandlerFactory可以被多次调用,并且应该提供一些证据,证明更改处理程序不应该导致任何奇怪的行为。

更有趣的是,我发现了一个1998 JDK docs,因为应该允许多次调用setURLStreamHandlerFactory,以便可以将多个处理程序链接在一起。功能请求已解析为 Future Project ,但显然从未实现过。