什么是非法反射访问?

简介: 反射通常由需要检查或修改在 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
目录
相关文章
|
运维 关系型数据库 OLAP
阿里云百炼 x AnalyticDB向量引擎, 搭积木式轻松开发专属大模型应用
对大模型应用跃跃欲试,但奈何技术栈复杂难以下手?已经进行试水,但缺乏调优手段无法保障召回率和问答准确度?自行搭建大模型、向量检索引擎、服务API等基础组件难以运维?大模型种类繁多,但缺乏行业模型和应用模板?阿里云百炼 x AnalyticDB向量引擎推出一站式企业专属大模型开发和应用平台,像搭积木一样轻松完成企业专属大模型应用的开发,提供应用API,可一键接入企业自己的业务应用对外提供服务。
2674 2
|
10月前
|
安全 Java API
Spring Boot 3.x 在 2.x基础上有什么重大的改进?
Spring Boot 3.x于2022年11月发布,带来了诸多重大更新。主要改进包括:最低要求Java 17,整合Jakarta EE 9,优化实例化和配置支持,基于Spring Framework 6.x,引入AOT编译,增强GraalVM原生映像支持,改进日志管理和集成测试,提供更详细的Actuator监控功能,以及对Spring Cloud的兼容性更新。这些变化为现代云原生应用开发提供了更强支持。
838 36
|
监控 Java 应用服务中间件
Spring和Spring Boot的区别
Spring和Spring Boot的主要区别,包括项目配置、开发模式、项目依赖、内嵌服务器和监控管理等方面,强调Spring Boot基于Spring框架,通过约定优于配置、自动配置和快速启动器等特性,简化了Spring应用的开发和部署过程。
610 19
|
Linux 视频直播
FFmpeg开发笔记(五十四)使用EasyPusher实现移动端的RTSP直播
本文介绍了如何使用EasyPusher-Android实现RTSP直播流程。首先对比了RTSP、RTMP、SRT和RIST四种流媒体协议,并以RTSP为例,详细说明了使用EasyPusher-Android向流媒体服务器进行RTSP直播推流的方法。文中还提供了OBS Studio配置RTSP插件及ZLMediaKit云服务器部署的相关信息,通过修改EasyPusher-Android源码使其支持通用RTSP地址,最终验证了直播功能的成功实现。
466 0
FFmpeg开发笔记(五十四)使用EasyPusher实现移动端的RTSP直播
|
存储 安全 OLAP
AnalyticDB安全与合规:数据保护与访问控制
【10月更文挑战第25天】在当今数据驱动的时代,数据的安全性和合规性成为了企业关注的重点。AnalyticDB(ADB)作为阿里云推出的一款高性能实时数据仓库服务,提供了丰富的安全特性来保护数据。作为一名长期使用AnalyticDB的数据工程师,我深知加强数据安全的重要性。本文将从我个人的角度出发,分享如何通过数据加密、访问控制和审计日志等手段加强AnalyticDB的安全性,确保数据的安全性和合规性。
242 2
|
监控 数据挖掘 数据安全/隐私保护
ERP系统中的客户关系管理(CRM)
【7月更文挑战第25天】 ERP系统中的客户关系管理(CRM)
940 3
|
机器人 Linux 芯片
DockerHub无法拉取镜像怎么办
众所周知,由于一些不可抗力,导致Docker Hub需要梯子访问才可以拉取镜像,我这里提供几种我自己的解决方案
911 3
|
C语言 C++
CLion2022安装与使用
CLion2022安装与使用
398 0
CLion2022安装与使用
|
IDE 开发工具 Python
【Python】已解决:pip安装第三方模块(库)与PyCharm中不同步的问题(PyCharm添加本地python解释器)
【Python】已解决:pip安装第三方模块(库)与PyCharm中不同步的问题(PyCharm添加本地python解释器)
2970 0