在Java9中有很多关于非法反射访问的问题。
我发现了很多关于如何处理错误消息的讨论,但我想知道非法反射访问实际上是什么。
所以我的问题是:
我认为这与Java9中引入的封装原则有关,但我找不到一个解释,说明它们是如何联系在一起的,是什么触发了警告,以及在什么场景中。
除了了解模块之间的访问和它们各自的包之外。我相信它的症结在于模块系统#reaseld-strong-encapsulation,我只想挑选它的相关部分来尝试回答这个问题。
什么定义了一个非法的反射访问和什么情况触发警告?
为了帮助迁移到Java-9,可以放松模块的强大封装。
>
一个实现可以提供静态访问,即通过编译的字节码。
可以提供一种方法来调用它的运行时系统,它的一个或多个模块的一个或多个包对所有未命名模块中的代码开放,即对类路径上的代码开放。如果以这种方式调用运行时系统,并且如果这样做,反射API的某些调用成功了,否则它们就会失败。
在这种情况下,您实际上已经完成了一个“非法”的反射访问,因为在一个纯模块化的世界中,您不应该进行这样的访问。
这种封装的放松在运行时由一个新的启动器选项--非法访问
控制,在Java9中,这个选项默认等于permit
。permit
模式确保
对任何此类包的第一个反射访问操作会导致发出警告,但在该点之后不会发出警告。此单个警告描述如何启用更多警告。不能压制此警告。
这些模式可以通过值debug
(每个此类访问的消息和stacktrace)、warn
(每个此类访问的消息)和deny
(禁用此类操作)进行配置。
在应用程序上需要调试和修复的东西很少:-
--illegal-access=deny
运行它,以了解并避免在没有模块声明(包括这样的指令(opens
)或显式使用--add-opens
VM参数的情况下将包从一个模块打开到另一个模块。--jdk-internals
选项的jdeps
工具来标识从编译代码到JDK-internals的静态引用 检测到非法反射访问操作时发出的警告消息的形式如下:
WARNING: Illegal reflective access by $PERPETRATOR to $VICTIM
其中:
$Priverator
是包含调用所讨论的反射操作的代码的类型的完全限定名,加上代码源(即,JAR-file路径)(如果可用),并且
$favicy
是描述要访问的成员的字符串,包括封闭类型的完全限定名
对于这样的示例警告的问题:=jdk9:发生了非法的反射访问操作。org.python.core.pysystemstate
最后,也是一个重要的注意事项,在试图确保您不会面临这样的警告并且将来是安全的同时,您所需要做的就是确保您的模块不会进行那些非法的反射访问。:)
JDK11+spring批处理 有人知道那些警告是什么意思吗: 警告:发生了非法的反射访问操作警告:org.springframework.cglib.core.reflectutils$1(jar:file:/users/boru/downloads/spcljr/build/libs/spcljr-0.0.1-snapshot.jar!/boot-inf/lib/spring-core-5.0
本文向大家介绍什么是反射?相关面试题,主要包含被问及什么是反射?时的应答技巧和注意事项,需要的朋友参考一下 反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。
我正在使用反射来调用java.util.Stream.Stream上的方法,但由于实际实现(ReferencePipeline等)具有运行的实际代码,因此在调用时会收到非法的反射访问警告,如果没有该调用,它将无法工作。我想知道是否有一种方法可以自动将其委托给一个访问不非法的超级方法?也就是说,我想调用,其中是合法的,而不是或任何实现。 编辑这里是一些代码。是通过反射获得的流的具体实例。
所谓反射,是java在运行时进行自我观察的能力,通过class、constructor、field、method四个方法获取一个类的各个组成部分。 在Java运行时环境中,对任意一个类,可以知道类有哪些属性和方法。这种动态获取类的信息以及动态调用对象的方法的功能来自于反射机制。
最近升级到Java11并开始执行回归检查。当前在尝试调用时出现非法反射访问错误。目前在Itext版本5.5.13上,但也在Itext 7.0.0上试用过,出现了相同的问题。 有人对如何修复Java-11和iText之间的兼容性问题有什么建议吗? 警告:发生了非法反射访问操作警告:com.itextpdf.io.source.ByteBufferRandomAccessSource$1(文件:...