JDK9:发生了非法的反光访问操作。org.python.core.PySystemState

2022-08-31 17:01:40

我正在尝试使用Java9(JDK9)运行DMelt程序(http://jwork.org/dmelt/)程序,它给我带来了错误,例如:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.python.core.PySystemState (file:/dmelt/jehep/lib/jython/jython.jar) to method java.io.Console.encoding()
WARNING: Please consider reporting this to the maintainers of org.python.core.PySystemState
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

我该如何修复它?我试图将-illegal-access=permit添加到脚本“dmelt.sh”的最后一行(我在Linux中使用bash),但这并没有解决这个问题。我对此感到非常沮丧。我经常使用这个程序,很长一段时间。也许我永远不应该搬到JDK9


答案 1

解决此问题的理想方法是

将此报告给 org.python.core.PySystemState 的维护者

并要求他们修复这种反思性访问。


但是,如果默认模式允许非法的反射访问,那么必须将其告知,以便人们在将来的版本中不再默认模式时不会感到惊讶。

邮件列表上的一个线程:

--illegal-access=permit

这将是 JDK 9 的默认模式。它打开每个显式模块中的每个包,以在所有未命名的模块中进行编码,即类路径上的代码,就像今天一样。--permit-illegal-access

第一个非法的反射访问操作会导致发出警告,与 一样,但在该点之后不会发出任何警告。此单个警告将描述如何启用进一步的警告。--permit-illegal-access

--illegal-access=deny

这将禁用所有非法的反射访问操作,但其他命令行选项(如 )启用的操作除外。这将成为未来版本中的默认模式。--add-opens

与以前一样,通过明智地使用 和 选项,可以避免任何模式下的警告消息。--add-exports--add-opens


因此,当前可用的临时解决方案是用作文档中提到的VM参数:--add-exports

--add-exports module/package=target-module(,target-module)*

更新模块以将包导出到 ,而不考虑模块声明。可以全部未命名以导出到所有未命名模块。target-moduletarget-module

这将允许 访问 中的所有公共类型。如果您想访问仍将被封装的 JDK 内部类,则必须允许使用参数进行深度反射,如下所示:target-modulepackage--add-opens

--add-opens module/package=target-module(,target-module)*

更新模块以将包打开到 ,而不考虑模块声明。target-module

在您当前访问的情况下,您只需将其添加为VM选项 -java.io.Console

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

另外,请注意与上面链接的相同线程

deny 成为默认模式时,我希望允许至少在一个版本中保持受支持,以便开发人员可以继续迁移其代码。随着时间的推移,允许警告调试模式将被删除,--illegal-access选项本身也将被删除。

因此,最好更改实现并遵循理想的解决方案。


答案 2

DMelt似乎使用Jython,这个警告是Jython维护者需要解决的问题。这里有一个问题跟踪它:http://bugs.jython.org/issue2582


推荐