4

我有以下代码URLStreamHandlers通过访问静态包作用域方法来检索在 Java 8 中工作的 http 和 https的默认值URL.getURLStreamHandler()

private URLStreamHandler getURLStreamHandler(String protocol) {
    try {
        Method method = URL.class.getDeclaredMethod("getURLStreamHandler", String.class);
        method.setAccessible(true);
        return (URLStreamHandler) method.invoke(null, protocol);
    } catch (Exception e) {
        logger.warning("could not access URL.getUrlStreamHandler");
        return null;
    }
}

这在 Java 9 中是否仍然可以使用jigsaw或禁止以这种方式修改可见性?

4

1 回答 1

4

它曾经在早期的原型中是可能的,但现在已经不可能了。Jigsaw 的可访问性规则现在仅限制对public元素(类型、方法、字段)的访问。

在您的示例中,调用method.setAccessible(true)将失败,并显示与此类似的消息:

java.lang.reflect.InaccessibleObjectException:无法使 getURLStreamHandler 可访问:模块 java.... 不会“打开 java....”到未命名的模块 @1941a8ff

请参阅此问题以了解如何解决此问题。

于 2016-04-09T13:15:36.567 回答