猿问

什么是非法的反射访问

关于Java 9中的非法反射访问,存在很多问题。


现在我找不到,因为所有Google都涌现出来,是人们试图解决错误消息,实际上是非法的反射访问。


所以我的问题很简单:


什么定义了非法的反射访问,什么情况触发了警告?


我已经了解到,它与Java 9中引入的封装原理有关,但是它们如何结合在一起以及在无法找到解释的情况下是什么触发了警告。


PIPIONE
浏览 1250回答 3
3回答

陪伴而非守候

除了了解模块及其各自程序包之间的访问。我相信它的关键在于模块系统#Relaxed-strong-encapsulation,而我只是选择其中的相关部分来尝试回答这个问题。什么定义了非法的反射访问,什么情况触发了警告?为了帮助向Java9的迁移,可以放松对模块的强封装。一个实现可以提供静态访问,即通过编译的字节码。可以提供一种方法,用其一个或多个模块的一个或多个软件包打开其运行时系统,以对所有未命名模块进行编码,即在类路径上进行编码。如果以这种方式调用运行时系统,并且这样做,则反射API的某些调用成功,否则它们将失败。在这种情况下,您实际上最终进行了“非法”的反射访问,因为在纯模块化的世界中,您并非必须进行此类访问。在所有情况下,它们如何挂在一起以及触发警告的原因是什么?封装的放松是在运行时由新的启动器选项控制的,--illegal-access在Java9中默认情况下等于permit。该permit模式确保对任何此类包装的第一次反射式访问操作都会导致发出警告,但在此之后不再发出警告。此单个警告描述了如何启用进一步的警告。此警告不能被抑制。可以使用值debug(每个此类访问的消息以及堆栈跟踪),warn(每个此类访问的消息)和deny(禁用此类操作)值来配置模式。调试和修复应用程序的几件事是:运行它--illegal-access=deny来了解并避免在没有模块声明(包括此类directive()或显式使用VM arg )的情况下将程序包从一个模块打开到另一个模块。opens--add-opens使用jdeps带有--jdk-internals选项的工具,可以识别从已编译代码到JDK内部API的静态引用。检测到非法反射访问操作时发出的警告消息具有以下形式:WARNING: Illegal reflective access by $PERPETRATOR to $VICTIM哪里:$PERPETRATOR 是类型的标准名称,其中包含调用了相关反射操作的代码以及代码源(即JAR文件路径)(如果有),以及$VICTIM 是描述正在访问的成员的字符串,包括封闭类型的全限定名称有关示例警告的问题:= JDK9:发生了非法的反射访问操作。org.python.core.PySystemState最后一个重要说明,在尝试确保您不会遇到此类警告并日后安全时,您需要做的就是确保您的模块没有进行那些非法的反射访问。:)
随时随地看视频慕课网APP

相关分类

Java
我要回答