Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java9中,是否可以使用Jigsaw通过反射访问包范围的方法?_Java_Java 9_Java Platform Module System - Fatal编程技术网

在Java9中,是否可以使用Jigsaw通过反射访问包范围的方法?

在Java9中,是否可以使用Jigsaw通过反射访问包范围的方法?,java,java-9,java-platform-module-system,Java,Java 9,Java Platform Module System,我有下面的代码来检索http和https的默认urlStreamHandler,它通过访问静态包作用域方法URL.getURLStreamHandler(),在Java 8中工作: 这在Java 9中是否仍然可行,或者是否会禁止以这种方式修改可见性?在早期原型中曾经是可行的,但现在已经不可能了。Jigsaw的可访问性规则现在只限制对public元素(类型、方法、字段)的访问 在您的示例中,调用method.setAccessible(true)将失败,并显示类似以下消息: java.lang.r

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


这在Java 9中是否仍然可行,或者是否会禁止以这种方式修改可见性?

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

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

java.lang.reflect.InAccessibleObject异常:无法使getURLStreamHandler可访问:模块java。。。。不会在@1941a8ff的未命名模块上“打开java…”


有关如何解决此问题,请参阅。

可能存在通过访问覆盖访问它们的可能性,但由于包私有方法不是官方API的一部分,因此无法保证该方法将存在…
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;
    }
}