- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Java 9 中存在很多关于非法反射访问的问题。
我发现了很多关于解决错误消息的讨论,但我很想知道非法反射访问实际上是什么。
所以我的问题是:
非法反射访问的定义是什么以及什么情况会触发警告?
我认为它与 Java 9 中引入的封装原则有关,但我找不到关于它们如何组合在一起、什么触发警告以及在什么情况下的解释。
最佳答案
除了了解模块及其各自包之间的访问之外。我相信关键在于 Module System#Relaxed-strong-encapsulation 我会挑选其中的相关部分来尝试回答这个问题。
What defines an illegal reflective access and what circumstancestrigger the warning?
为了帮助迁移到 Java-9,可以放松模块的强封装。
实现可以提供静态访问,即通过编译的字节码。
可以提供一种方法来调用其运行时系统,其中一个或多个模块的一个或多个包对所有未命名模块中的代码开放,即在类路径上进行编码。如果以这种方式调用运行时系统,并且通过这样做,反射 API 的某些调用会成功,否则它们会失败。
在这种情况下,您实际上最终进行了反射访问,这是“非法”,因为在纯模块化世界中您不应该进行此类访问.
How it all hangs together and what triggers the warning in whatscenario?
这种封装的放松是在运行时由新的启动器选项--illegal-access
控制的,在Java9中默认等于permit
。 permit
模式确保
The first reflective-access operation to any such package causes awarning to be issued, but no warnings are issued after that point.This single warning describes how to enable further warnings. Thiswarning cannot be suppressed.
这些模式可通过以下值进行配置:debug
(每个此类访问的消息以及堆栈跟踪)、warn
(每个此类访问的消息)和 deny
(禁用此类操作)。
应用程序上需要调试和修复的一些事情是:-
--illegal-access=deny
运行它,以了解并避免在没有包含此类指令的模块声明的情况下从一个模块打开包到另一个模块(opens
) 或显式使用 --add-opens
VM arg。--jdk-internals
选项的 jdeps
工具来识别从已编译代码到 JDK 内部 API 的静态引用The warning message issued when an illegal reflective-access operationis detected has the following form:
WARNING: Illegal reflective access by $PERPETRATOR to $VICTIM
where:
$PERPETRATOR
is the fully-qualified name of the type containing thecode that invoked the reflective operation in question plus the codesource (i.e., JAR-file path), if available, and
$VICTIM
is a string that describes the member being accessed,including the fully-qualified name of the enclosing type
此类示例警告的问题:= JDK9: An illegal reflective access operation has occurred. org.python.core.PySystemState
最后一点也是重要的一点,在努力确保您不会面临此类警告并确保 future 安全的同时,您所需要做的就是确保您的模块不会进行这些非法反射访问。 :)
关于java - 什么是非法反射访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61753812/
一、反射 1.定义 Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法(即使是私有的);对于任意一个对象,都能够调用它的任意方法和属性,那么,我
有没有办法从 JavaScript 对象内部获取所有方法(私有(private)、特权或公共(public))?这是示例对象: var Test = function() { // private m
我有一个抽象类“A”,类“B”和“C”扩展了 A。我想在运行时根据某些变量创建这些实例。如下所示: public abstract class A { public abstract int
假设我们在内存中有很多对象。每个都有一个不同的ID。如何迭代内存以找到与某些 id 进行比较的特定对象?为了通过 getattr 获取并使用它? 最佳答案 您应该维护这些对象的集合,因为它们是在类属性
假设我有这个结构和一个方法: package main import ( "fmt" "reflect" ) type MyStruct struct { } func (a *MyS
C#反射简介 反射(Reflection)是C#语言中一种非常有用的机制,它可以在运行时动态获取对象的类型信息并且进行相应的操作。 反射是一种在.NET Framework中广
概述 反射(Reflection)机制是指在运行时动态地获取类的信息以及操作类的成员(字段、方法、构造函数等)的能力。通过反射,我们可以在编译时期未知具体类型的情况下,通过运行时的动态
先来看一段魔法吧 public class Test { private static void changeStrValue(String str, char[] value) {
结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套; go中的struct类型理解为类,可以定义方法,和函数定义有些许区别; struct类型是值类型
反射 1. 反射的定义 Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到那么,我们
反射的定义 java的反射(reflection) 机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到嘛,那么,我们就可以
我有一个 Java POJO: public class Event { private String id; private String name; private Lon
我编写了以下函数来检查给定的单例类是否实现了特征。 /** Given a singleton class, returns singleton object if cls implements T.
我正在研究 Java 反射的基础知识并观察有关类方法的信息。我需要获得一个符合 getMethod() 函数描述的规范的方法。然而,当我这样做时,我得到了一个 NoSuchMethodExceptio
我正在通过以下代码检索 IEnumerable 属性列表: BindingFlags bindingFlag = BindingFlags.Instance | BindingFlags.Public
我需要检查属性是否在其伙伴类中定义了特定属性: [MetadataType(typeof(Metadata))] public sealed partial class Address { p
我正在尝试使用 Reflections(由 org.reflections 提供)来处理一些繁重的工作,因此我不需要在很长的时间内为每个类手动创建一个实例列表。但是,Reflections 并未按照我
scala 反射 API (2.10) 是否提供更简单的方法来搜索加载的类并将列表过滤到实现定义特征的特定类? IE; trait Widget { def turn(): Int } class
我想在运行时使用反射来查找具有给定注释的所有类,但是我不知道如何在 Scala 中这样做。然后我想获取注释的值并动态实例化每个映射到关联注释值的带注释类的实例。 这是我想要做的: package pr
这超出了我的头脑,有人可以更好地向我解释吗? http://mathworld.wolfram.com/Reflection.html 我正在制作一个 2d 突破格斗游戏,所以我需要球能够在它击中墙壁
我是一名优秀的程序员,十分优秀!