在Java9中,是否可以使用Jigsaw通过反射访问包范围的方法?
我有下面的代码来检索http和https的默认在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
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;
}
}