除了了解模块及其各自包之间的访问之外。我相信问题的关键在于模块系统#宽松强封装 http://openjdk.java.net/jeps/261#Relaxed-strong-encapsulation我会挑选其中的相关部分来尝试回答这个问题。
什么定义了非法反射访问以及什么情况
触发警告?
为了帮助迁移到 Java-9,可以放松模块的强封装。
在这种情况下,你实际上最终做了一个反思性访问这是“非法的”因为在纯粹的模块化世界中,您不应该进行此类访问。
这一切是如何结合在一起的以及什么会触发警告
设想?
这种封装的放松是在运行时由新的启动器选项控制的--illegal-access
在 Java 9 中默认等于permit
. The permit
模式确保
对任何此类包的第一个反射访问操作都会导致
发出警告,但此后不再发出警告。
此单个警告描述了如何启用进一步的警告。这
警告无法被抑制。
模式可通过值进行配置debug
(每次此类访问的消息以及堆栈跟踪),warn
(每个此类访问的消息),以及deny
(禁用此类操作)。
应用程序上需要调试和修复的几件事是:-
- 运行它
--illegal-access=deny
了解并避免open将包从一个模块转移到另一个模块,而无需包含此类指令的模块声明(opens
)或明确使用--add-opens
VM arg.
- 可以使用以下命令来识别从已编译代码到 JDK 内部 API 的静态引用
jdeps
工具与--jdk-internals
option
非法反射访问操作时发出的警告消息
检测到的具有以下形式:
WARNING: Illegal reflective access by $PERPETRATOR to $VICTIM
where:
$PERPETRATOR
是包含以下类型的完全限定名称
调用相关反射操作的代码加上代码
源(即 JAR 文件路径)(如果可用),以及
$VICTIM
是一个描述正在访问的成员的字符串,
包括封闭类型的完全限定名称
对于此类示例警告的问题:=JDK9:发生了非法反射访问操作。 org.python.core.PySystemState https://stackoverflow.com/questions/46230413/jdk9-an-illegal-reflective-access-operation-has-occurred-org-python-core-pysys
最后一点也是重要的一点,在努力确保您不会面临此类警告并确保未来安全的同时,您所需要做的就是确保您的模块不会进行这些非法反射访问。 :)