【发布时间】: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