【发布时间】:2021-08-17 10:47:41
【问题描述】:
现有代码在安装了 JDK11 后运行良好。 JDK16中相同的代码行抛出错误
java.lang.reflect.InaccessibleObjectException: Unable to make private static native long[] java.util.prefs.WindowsPreferences.WindowsRegOpenKey(long,byte[],int) accessible: module java.prefs does not "opens java.util.prefs" to unnamed module @3f803fae
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:357)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199)
at java.base/java.lang.reflect.Method.setAccessible(Method.java:193)
当代码从 Java8 迁移到 Java9 时,WinRegistry.java 文件被修改为来自 int 到 long
【问题讨论】:
-
此应用程序的用户在他们的机器上安装了 Java16 并看到此错误。对于 Java11,没有观察到相同的问题。请提出解决此问题的方法。
-
自 Java 9 以来,您应该已经看到一个警告,表明这将发生。现在它发生了。
-
它在 11 中不能“完全正常”;它在 11 中“几乎无法工作”,并且在编译和运行时都有明确的警告。当然,闯入其他类的私有领域不应该是你永远应该指望的事情。这就是为什么他们是私人的。这充其量只是一个骇人听闻的短期解决方法,而短期现在已经结束了。
-
您将不得不切换到使用类似jna 的东西来访问Windows 注册表——例如
Advapi32Util类 -
或使用
ProcessBuilder运行reg命令。
标签: java eclipse reflection java-16