什么是非法反射访问?

简介: 反射通常由需要检查或修改在 Java 虚拟机中运行的应用程序的运行时行为的能力的程序使用。这是一个相对高级的功能,只能由对语言基础知识有很强掌握的开发人员使用。考虑到这一点,反射是一种强大的技术,可以使应用程序执行原本不可能完成的操作。

一、反射的用途

反射通常由需要检查或修改在 Java 虚拟机中运行的应用程序的运行时行为的能力的程序使用。这是一个相对高级的功能,只能由对语言基础知识有很强掌握的开发人员使用。考虑到这一点,反射是一种强大的技术,可以使应用程序执行原本不可能完成的操作。

二、反射的缺点

反射很强大,但不应该乱用。如果可以在不使用反射的情况下执行操作,那么最好避免使用它。通过反射访问代码时应牢记以下问题。

  • 性能开销
    由于反射涉及动态解析的类型,因此无法执行某些 Java 虚拟机优化。因此,反射操作的性能比非反射操作慢,因此应避免在性能敏感的应用程序中频繁调用的代码段中使用反射操作。
  • 安全限制
    反射需要运行时权限,在安全管理器下运行时可能不存在该权限。对于必须在受限安全上下文(例如 Applet)中运行的代码来说,这是一个重要的考虑因素。
  • 内部结构暴露
    由于反射允许代码执行在非反射代码中非法的操作(例如访问private字段和方法),因此使用反射可能会导致意外的副作用,这可能会导致代码功能失调并可能破坏可移植性。反射代码破坏了抽象,因此可能会随着平台的升级而改变行为。

    三、什么是非法的反射访问

    默认情况下,对包具有运行时反射访问权限的模块可以看到包的public类型(及其嵌套public和protected类型)。但是,其他模块中的代码可以访问公开包中的所有类型以及这些类型中的所有成员,包括privatevia 成员 setAccessible。即,访问public类型(及其嵌套public和protected类型)被认为是合法的,访问privatevia 成员被认为是非法。

    四、什么定义了非法反射访问?

    从JDK9开始默认情况下放宽了某些 JDK 包的强封装,种放松是在运行时由新的启动器选项 --illegal-access控制的,
  • --illegal-access=permit 打开运行时映像中每个模块中的每个包,以在所有未命名模块中进行编码,即,如果该包存在于 JDK 8 中,则在类路径上进行编码。这可以实现静态访问​​(即通过编译的字节码)和深度访问通过平台的各种反射 API 进行反射访问。
    对任何此类包的第一次反射访问操作都会导致发出警告,但此后不会发出警告。此单个警告描述了如何启用进一步的警告。该警告无法被抑制。此模式是 JDK 9 中的默认模式。它将在未来版本中逐步淘汰并最终删除。

  • --illegal-access=warn 与permit 相同,只是为每个非法反射访问操作发出警告消息。

  • --illegal-access=debug 与warn相同,只是针对每个非法反射访问操作都会发出警告消息和堆栈跟踪。

  • --illegal-access=deny 禁用所有非法访问操作,但由其他命令行选项启用的操作除外,例如--add-opens.此模式将成为未来版本中的默认模式。

    五、如何解决?

    可以使用“--add-opens”

--add-opens <source-module>/<package>=<target-module>(,<target-module>)*

假设有一个错误它来自 模块 java.base,包 java.lang:

java.lang.ClassLoader.findLoadedClass(java.lang.String)

按照上面的样式带入:

java --add-opens=java.base/java.lang=ALL-UNNAMED -jar example.jar
目录
相关文章
|
缓存 算法 NoSQL
【分布式详解】一致性算法、全局唯一ID、分布式锁、分布式事务、 分布式缓存、分布式任务、分布式会话
分布式系统通过副本控制协议,使得从系统外部读取系统内部各个副本的数据在一定的约束条件下相同,称之为副本一致性(consistency)。副本一致性是针对分布式系统而言的,不是针对某一个副本而言。强一致性(strong consistency):任何时刻任何用户或节点都可以读到最近一次成功更新的副本数据。强一致性是程度最高的一致性要求,也是实践中最难以实现的一致性。单调一致性(monotonic consistency):任何时刻,任何用户一旦读到某个数据在某次更新后的值,这个用户不会再读到比这个值更旧的值。
2049 0
|
8月前
|
人工智能 监控 Linux
AI开发革命:阿里云/本地部署OpenClaw+Codex/Claude Code 搭建AI Agent集群指南+免费多模型API配置+避坑教程
OpenClaw+AI Agent集群的模式,彻底打破了独立开发者的效率天花板,让"一人创办百万美元公司"从愿景变为现实。其核心并非依赖更强的AI模型,而是通过精妙的架构设计,让业务上下文与代码实现各司其职,同时借助自动化闭环与自我进化机制,持续降低人工干预成本。
3455 1
|
SQL 安全 UED
通义灵码在DBA日常SQL优化中的使用分享
通义灵码在DBA日常SQL优化中的使用分享
1190 1
通义灵码在DBA日常SQL优化中的使用分享
|
12月前
|
SQL 自然语言处理 关系型数据库
构建AI智能体:二十九、Text2SQL:告别繁琐SQL!用大模型自助生成数据报表
Text2SQL技术通过自然语言处理将用户查询转换为SQL语句,解决企业数据查询效率低下的痛点。该技术包含语义理解、模式对齐、SQL生成和优化等核心处理过程,核心组件包括自然语言理解模块、Schema管理模块和SQL生成模块。文章介绍了闭源和开源模型的选择策略,并提供了基于Function Calling的Text2SQL实现示例,展示如何安全高效地将自然语言转换为数据库查询。
4513 4
|
数据采集 Web App开发 JavaScript
Python爬虫如何获取JavaScript动态渲染后的网页内容?
Python爬虫如何获取JavaScript动态渲染后的网页内容?
|
SQL 自然语言处理 关系型数据库
通义灵码2.5来袭!MCP 功能直接让开发效率提升300%(附实战案例)
通义灵码2.5是阿里云推出的AI编码助手,以智能协作为核心,深度融合开发全流程。其三大升级点包括:编程智能体实现任务自主规划、MCP工具生态支持自然语言生成SQL、记忆进化系统个性化适配开发者习惯。通过自然语言即可完成数据库操作、代码生成与优化,大幅提升开发效率。此外,还具备工程级变更管理、多文件协同编辑及版本控制功能,适用于多种IDE环境,为企业提供安全高效的开发解决方案。
|
存储 关系型数据库 MySQL
Flink的Checkpoints机制详解
Flink的Checkpoints机制详解
|
监控 调度 流计算
【Flink】Flink的并行度了解吗?Flink的并行度设置是怎样的?
【4月更文挑战第18天】【Flink】Flink的并行度了解吗?Flink的并行度设置是怎样的?
|
存储 分布式数据库 Apache
【Flink】Flink的Checkpoint 存在哪里?
【4月更文挑战第19天】【Flink】Flink的Checkpoint 存在哪里?