是否可以使用 Jigsaw 在 Java 9 中通过反射访问包范围内的方法?
Is it possible to access package scoped methods by reflection in Java 9 with Jigsaw?
我有以下代码通过访问静态包范围方法 URL.getURLStreamHandler()
:
检索在 Java 8 中工作的 http 和 https 的默认值 URLStreamHandlers
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 还是会禁止以这种方式修改可见性?
它曾经在早期的原型中是可能的,但现在已经不可能了。 Jigsaw 的可访问性规则现在仅限制对 public
元素(类型、方法、字段)的访问。
在您的示例中,对 method.setAccessible(true)
的调用将失败并显示类似于此的消息:
java.lang.reflect.InaccessibleObjectException: Unable to make getURLStreamHandler accessible: module java.... does not "opens java...." to unnamed module @1941a8ff
请参阅 了解如何解决该问题。
我有以下代码通过访问静态包范围方法 URL.getURLStreamHandler()
:
URLStreamHandlers
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 还是会禁止以这种方式修改可见性?
它曾经在早期的原型中是可能的,但现在已经不可能了。 Jigsaw 的可访问性规则现在仅限制对 public
元素(类型、方法、字段)的访问。
在您的示例中,对 method.setAccessible(true)
的调用将失败并显示类似于此的消息:
java.lang.reflect.InaccessibleObjectException: Unable to make getURLStreamHandler accessible: module java.... does not "opens java...." to unnamed module @1941a8ff
请参阅