【问题标题】:Java Error with Java16 : java.lang.reflect.InaccessibleObjectExceptionJava16 的 Java 错误:java.lang.reflect.InaccessibleObjectException
【发布时间】: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 文件被修改为来自 intlong

【问题讨论】:

  • 此应用程序的用户在他们的机器上安装了 Java16 并看到此错误。对于 Java11,没有观察到相同的问题。请提出解决此问题的方法。
  • 自 Java 9 以来,您应该已经看到一个警告,表明这将发生。现在它发生了。
  • 它在 11 中不能“完全正常”;它在 11 中“几乎无法工作”,并且在编译和运行时都有明确的警告。当然,闯入其他类的私有领域不应该是你永远应该指望的事情。这就是为什么他们是私人的。这充其量只是一个骇人听闻的短期解决方法,而短期现在已经结束了。
  • 您将不得不切换到使用类似jna 的东西来访问Windows 注册表——例如Advapi32Util
  • 或使用ProcessBuilder 运行reg 命令。

标签: java eclipse reflection java-16


【解决方案1】:

使用 Advapi32Util.java

读取/写入 Windows 注册表要简单得多

使用此 JNA API,您可以轻松读取注册表键、值,还可以使用新键和值设置注册表。

我使用以下 API 来获取注册表项的注册表值,注册表项的路径如下

Advapi32Util.registryGetStringValue(WinReg.HKEY_LOCAL_MACHINE, registry_path, value_of)

另外,特定路径下的子键可以从下面的 API 中获取

Advapi32Util.registryGetKeys(HKEY root, String keyPath)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 2020-08-22
    • 2022-11-08
    • 2022-12-16
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多