【问题标题】:How to resolve InaccessibleObjectException for Field.setAccessible in JDK 17?如何解决 JDK 17 中 Field.setAccessible 的 InaccessibleObjectException?
【发布时间】:2022-08-13 03:41:14
【问题描述】:

使用 JDK 17,不再可能使用反射使字段可访问,至少对于 java.lang-classes 而言是不可能的。在sn-p之后:

final Process process = new ProcessBuilder().directory(new File(\"d:/temp\")).command(\"cmd.exe\").start();
final Field handleField = process.getClass().getDeclaredField(\"handle\");
handleField.setAccessible(true);

失败:

Exception in thread \"main\" java.lang.reflect.InaccessibleObjectException: Unable to make field private final long java.lang.ProcessImpl.handle accessible: module java.base does not \"opens java.lang\" to unnamed module @254989ff
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
    at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178)
    at java.base/java.lang.reflect.Field.setAccessible(Field.java:172)

有没有办法解决这个问题?

  • \"如何解决 [...]\":通过重写您的代码,这样就不再需要了。
  • @ThomasKläger 您究竟建议获得已启动进程的句柄(以便能够杀死整个进程树)?
  • @ThomasS。通过使用自 Java 9 以来 Java 支持的方法(参见 stackoverflow.com/a/10124625 的最后一个代码片段,使用 ProcessHandle

标签: java reflection


【解决方案1】:

正如this answer 指出的那样,一种解决方案是添加以下VM 选项:

java --add-opens java.base/java.lang=ALL-UNNAMED

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-28
    • 2022-06-23
    • 2022-09-26
    • 2015-04-18
    • 2018-01-22
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    相关资源
    最近更新 更多