首页 >Java >java教程 >Java 9 中的非法反射访问是什么以及它是如何表现的?

Java 9 中的非法反射访问是什么以及它是如何表现的?

Patricia Arquette
Patricia Arquette原创
2024-12-05 15:12:10309浏览

What is Illegal Reflective Access in Java 9 and How Does It Manifest?

非法反射访问

在 Java 9 中,非法反射访问是指以违反增强封装原则的方式使用反射 API 的情况由模块系统引入。当一个模块中的代码在未经适当授权的情况下尝试访问另一模块中类的私有或受保护成员时,可能会发生这种情况。

非法反射访问的定义

非法反射访问被定义为任何反射操作:

  • 访问另一个类中的私有或受保护成员module
  • 调用另一个模块中类的私有方法
  • 修改另一个模块中类的final字段
  • 创建不公开可见的类的实例在另一个模块

触发情况

在以下情况下会触发非法反射访问:

  • 一个模块中的类使用反射来访问另一个模块中未显式调用的类的私有或受保护成员通过模块声明或 VM 参数暴露给第一个模块。
  • 一个模块中的类使用反射来调用该模块中类的私有方法未显式暴露给第一个模块的另一个模块。
  • 一个模块中的类使用反射来修改未显式暴露给第一个模块的另一个模块中的类的最终字段。
  • 一个模块中的类使用反射来创建在另一个模块中不公开可见的类的实例。

模块系统和宽松封装

Java 9 引入了宽松强封装规则,允许某些有限形式的反射访问。具体来说,它允许模块的运行时系统打开模块中的包以在未命名模块中进行编码(即类路径上的代码)。如果使用此选项调用运行时系统,并且成功地使用反射,否则会失败,则发生“非法”反射访问。

警告消息

发生非法反射访问时,会发出以下格式的警告消息:

警告:非法反射$PERPETRATOR 访问 $VICTIM

,其中:

  • $PERPETRATOR 是包含调用反射操作的代码的类型的完全限定名称,加上代码源(JAR文件路径)(如果可用)。
  • $VICTIM 描述正在访问的成员,包括封闭的完全限定名称类型。

以上是Java 9 中的非法反射访问是什么以及它是如何表现的?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn