- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题在这里已经有了答案:
What is an illegal reflective access?
(5 个回答)
去年关闭。
在 JDK 9+ JVM 之后,如果您使用了一些非法访问,例如 setAccessible()
,则会发出非法访问操作警告。 .
我的问题
setAccessible()
以后会被屏蔽吗? WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.hazelcast.internal.networking.nio.SelectorOptimizer (file:/var/folders/9w/wp9vfqmn2ql0mp3lgym0bxf40000gn/T/toy.war-spring-boot-libs-0024b388-730f-430b-b21b-1611bd2ad612/hazelcast-4.0.2.jar) to field sun.nio.ch.SelectorImpl.selectedKeys
WARNING: Please consider reporting this to the maintainers of com.hazelcast.internal.networking.nio.SelectorOptimizer
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
最佳答案
1.是setAccessible()
以后会被屏蔽吗?
不, AccessibleObject#setAccessible(boolean)
没有被弃用,据我所知,也没有计划弃用它。
您看到的警告与此方法相关,但不直接相关。 Java 9 中引入的 Java 平台模块系统在编译时和运行时(即反射)都增加了更强的封装。运行时规则由 #setAccessible(boolean)
记录。 :
This method may be used by a caller in class
C
to enable access to a member of declaring classD
if any of the following hold:
C
andD
are in the same module.- The member is public and
D
is public in a package that the module containingD
exports to at least the module containingC
.- The member is protected static,
D
is public in a package that the module containingD
exports to at least the module containingC
, andC
is a subclass ofD
.D
is in a package that the module containingD
opens to at least the module containingC
. All packages in unnamed and open modules are open to all modules and so this method always succeeds whenD
is in an unnamed or open module.This method cannot be used to enable access to private members, members with default (package) access, protected instance members, or protected constructors when the declaring class is in a different module to the caller and the package containing the declaring class is not open to the caller's module.
SecurityManager
)。重大更改是一个问题,因为 Java 以向后兼容性为荣。为了给库和框架提供足够的迁移时间,他们针对特定场景放宽了这种强封装(见下文)。
--illegal-access
有关选项,由
java
tool specification 记录:
When present at run time,
--illegal-access=
takes a keyword parameter to specify a mode of operation:Note: This option will be removed in a future release.
permit
:此模式打开运行时镜像中每个模块中的每个包,以在所有未命名模块(例如类路径上的代码)中编码,如果该包存在于 JDK 8 [强调]。这允许通过平台的各种反射 API 进行静态访问(例如,通过编译的字节码和深度反射访问)。对任何此类包的第一次反射访问操作会导致发出警告。但是,在第一次发生后不会发出警告。此单个警告描述了如何启用更多警告。 此模式是当前 JDK 的默认模式,但将在 future 版本中更改 [强调]。
warn
: 此模式与 permit 相同,只是为每个非法反射访问操作发出警告消息。
debug
: 此模式与警告相同,除了为每个非法反射访问操作发出警告消息和堆栈跟踪之外。
deny
: 此模式禁用所有非法访问操作,但由其他命令行选项启用的操作除外,例如--add-opens
. 此模式将成为 future 版本中的默认模式 [强调]。
默认模式,--illegal-access=permit
, 旨在让您了解类路径上的代码至少反射访问任何 JDK 内部 API 一次。要了解所有此类访问,您可以使用警告或 Debug模式。对于需要非法访问的类路径上的每个库或框架,您有两个选择:
如果组件的维护者已经发布了不再使用 JDK 内部 API 的固定版本,那么您可以考虑升级到该版本。
如果该组件仍然需要修复,那么您可以联系其维护人员,并要求他们使用适当的导出 API 替换对 JDK 内部 API 的使用。
如果您必须继续使用需要非法访问的组件,那么您可以使用一个或多个--add-opens
来消除警告消息。选项以仅打开需要访问的那些内部包。
要验证您的应用程序是否已为 JDK 的 future 版本做好准备,请使用--illegal-access=deny
运行它。以及任何必要的--add-opens
选项。任何剩余的非法访问错误很可能是由于从编译代码到 JDK 内部 API 的静态引用。您可以通过运行jdeps
来识别这些。带有--jdk-internals
的工具选项。出于性能原因,当前的 JDK 不会对非法静态访问操作发出警告。
总结强调的部分:
默认模式是 permit
.这允许未命名模块(即类路径)中的代码访问运行时镜像(即 JDK)中模块内的成员,即使这些成员位于未导出/未打开的包中(只要这些包存在于 JDK 8 中)。
最终默认模式将是 deny
.此时任何未正确迁移的代码都将停止工作。这就是您看到警告的原因——他们希望您解决问题(如果是您自己的代码,或者提交错误报告,如果是第三方代码)。
--illegal-access
选项本身最终将被完全删除。
这些变化将在什么版本中发生......我不知道。然而,--illegal-access
在默认模式变为deny
后,选项可能会被删除一两个版本。 .
更新(2021 年 5 月 31 日)
JEP 396: Strongly Encapsulate JDK Internals by Default随 Java 16 一起提供并设为默认模式deny
.--illegal-access
选项仍然存在。
JEP 403: Strongly Encapsulate JDK Internals当前针对 Java 17。这将使permit
,warn
, 和debug
模式无效并尝试使用它们将导致发出警告。然而,--illegal-access
选项将暂时保留(但计划在 future 版本中删除)。
关于Java `illegal access operations` 方法将被弃用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63407349/
我正在尝试编写 Access Access 数据库的脚本,以便在命令行上使用。 Access 数据库使用工作组文件进行保护。 Dim oApp, sWGF,myWS Set sApp = Create
我有一个包含数据表的表格。我希望用户能够选择多行,单击按钮并运行一些 sql 查询并对这些行执行一些工作。 查看我的 VBA 代码,我发现如何使用 CurrentRecord 属性 Access 最后
如果我在某个网络位置有 Microsoft Access 2007 数据库,那么可以使用该数据库的客户端计算机的数量是否有限制?客户端不会安装 Access,而是使用 Access Runtime 2
我正在开发一个注册系统。但我收到此错误:You tried to execute a query that does not include the specified expression.. 我正
我有一个产品设计为使用 MS Access 文件作为数据库的桌面产品。 现在,一些用户需要将它安装在几台 PC(比如说 2 或 3 台)上并共享数据库。 我想将 MS Access 文件放在共享文件夹
我接手了一个旧的软件项目,该项目使用 MS Access 数据库来存储数据。但是数据库不会在 Access 中打开,如下所示: "You do not have the necessary permi
我有一个文件夹,里面装满了 100 多个 Access97 文件。我需要将它们全部更新到 Access2003。 我可以手动完成,但使用 VBA 可能会快很多。 有没有人会有一个片段可以做到这一点?或
我正在通过 SQL Server 迁移助手 (SSMA) 将数据从 Access 数据库迁移到 SQL Server。 Access 应用程序将继续与转换为链接表的本地表一起使用。 一个连续的表单在加
我正在通过 SQL Server 迁移助手 (SSMA) 将数据从 Access 数据库迁移到 SQL Server。 Access 应用程序将继续与转换为链接表的本地表一起使用。 一个连续的表单在加
我的公司用 Visual Basic 6 开发了一个应用程序。 该应用程序通过 ODBC 数据源使用 Access 数据库。 Access 数据库是一个扩展名为“.mdb”的文件。 在以下环境中运行应
我一直在尝试让 Microsoft Access 从主 Access 窗口中“退出”,以便我可以隐藏 Access 窗口并仅在桌面上显示表单,以便可以轻松地将其放置在其他应用程序旁边。 起初我发现了一
我想在 access 2010 中使用 access 2000 和 2003 数据库。由于我不想检查一切是否手动工作,我正在寻找一种工具来分析 VBA 代码以查找使用 access 2010 发生的错
所以我有一个 Excel 工作簿,其中有一个很好的 shaperange 对象的全局 map 。通过一些非常简单的代码,我可以更改颜色、将国家/地区集合分组和取消分组为数组等......并且效果非常好
我们希望有大约 35-40 人通过共享驱动器上的脚本写入 Access 数据库。这些指标分解为他们需要每小时写大约 3-7 次。 Access 会支持这一点而不会对我产生影响吗? 是的,我很乐意将其用
我正在寻找一种使用 VBA 代码从外部数据库文件中删除 VBA 模块的方法。名为“myfile.accdb”的外部文件有一个名为“mod1”的模块,我希望能够在单独的项目中使用 VBA 代码删除该模块
我在 Access 2003 数据库(在 Access 2007 中开发)中有三个表单,它们处于父级 -> 子级 -> 孙子级关系中。在子窗体的 'Form_Load' 子窗体中,我设置了孙子窗体的一
MS Access 2007 存在拒绝在设计模式下显示表单的问题。我可以看到表单的代码(如果我查看显示表单的按钮的事件属性),但我看不到作为 GUI 布局的表单。而且,当我尝试从应用程序的主窗口调用此
我编写了代码,使用 Excel 中的下拉列表提供的标准将两个表连接起来,然后将数据返回到电子表格上的特定位置(工作表上已经有标题)。 这在我的机器上和其他机器上使用 MS Access 的机器上都可以
我正在开始构建一个应用程序,该应用程序从给定的根路径开始遍历文件夹结构,并将所有找到的 Access 1997 .mdb 文件转换为较新的 Access 2007/2010 .accdb 格式。但是,
我有一个表单和一个按钮。我想通过单击按钮打开另一个表单,并将参数从父表单传递到子表单(子表单的 RecordSource 有参数)。我该怎么做? 最佳答案 您可以通过引用表单的对象来引用调用表单的任何
我是一名优秀的程序员,十分优秀!