如何在 Java 内部使用 Java 9 的反射?
How can I use reflection with Java 9 on the Java internals?
我们只在我们的测试框架中使用这种类型的反射,而不是在生产中。我们想根据我们的测试代码向应用程序类加载器添加一些 jar 文件。有什么解决方法吗?我们怎样才能访问未导出的 类?
java.lang.reflect.InaccessibleObjectException: Unable to make member of class jdk.internal.loader.ClassLoaders$AppClassLoader accessible: module java.base does not export jdk.internal.loader to unnamed module @9f73a2
at jdk.internal.reflect.Reflection.throwInaccessibleObjectException(Reflection.java:414)
at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:174)
at java.lang.reflect.Method.checkCanSetAccessible(Method.java:191)
at java.lang.reflect.Method.setAccessible(Method.java:185)
无法通过代码访问模块内部 类。这是故意的。但是命令行有一个解决方法 - java
上的非标准化选项可以满足您的要求:
--add-exports <module>/<package>=<target-module>(,<target-module>)*
updates <module> to export <package> to <target-module>,
regardless of module declaration.
<target-module> can be ALL-UNNAMED to export to all
unnamed modules.
备注
Java 9 是一个移动的目标,确切的语法已经更改了几次 - 这个答案也是如此。这意味着 (a) 下面的一些评论可能看起来已经过时,并且 (b) 标志可能不会像那样工作。请发表评论,它会得到修复。
我们只在我们的测试框架中使用这种类型的反射,而不是在生产中。我们想根据我们的测试代码向应用程序类加载器添加一些 jar 文件。有什么解决方法吗?我们怎样才能访问未导出的 类?
java.lang.reflect.InaccessibleObjectException: Unable to make member of class jdk.internal.loader.ClassLoaders$AppClassLoader accessible: module java.base does not export jdk.internal.loader to unnamed module @9f73a2
at jdk.internal.reflect.Reflection.throwInaccessibleObjectException(Reflection.java:414)
at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:174)
at java.lang.reflect.Method.checkCanSetAccessible(Method.java:191)
at java.lang.reflect.Method.setAccessible(Method.java:185)
无法通过代码访问模块内部 类。这是故意的。但是命令行有一个解决方法 - java
上的非标准化选项可以满足您的要求:
--add-exports <module>/<package>=<target-module>(,<target-module>)*
updates <module> to export <package> to <target-module>,
regardless of module declaration.
<target-module> can be ALL-UNNAMED to export to all
unnamed modules.
备注
Java 9 是一个移动的目标,确切的语法已经更改了几次 - 这个答案也是如此。这意味着 (a) 下面的一些评论可能看起来已经过时,并且 (b) 标志可能不会像那样工作。请发表评论,它会得到修复。