首页 > 其他分享 >什么是非法反射访问?

什么是非法反射访问?

时间:2023-10-07 17:06:28浏览次数:18  
标签:反射 java -- 非法 access 访问 操作

一、反射的用途

反射通常由需要检查或修改在 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

标签:反射,java,--,非法,access,访问,操作
From: https://blog.51cto.com/TiMi/7739492

相关文章

  • lesson9 简易计算器-3 内部类 更好的包装 访问 外部的属性和方法
    内部类更好的包装访问外部的属性和方法  packagecom.zym.lesson9;importjavax.swing.*;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;......
  • 【访问控制】cgroup限制磁盘读写
    一、前言参考链接:Cgroup-Linux的IO资源隔离用cgroups管理进程磁盘io二、blkio配置blkio是cgroup中的一个子系统,可以用于限制及监控磁盘读写ioblkio控制子系统可以限制进程读写的IOPS和吞吐量,但它只能对DirectI/O的文件读写进行限速,对BufferedI/O的文件读......
  • 【访问控制】hosts.allow/deny配置说明
    一、前言一个IP请求连入,linux的检查策略是先看/etc/hosts.allow中是否允许,如果允许直接放行;如果没有,则再看/etc/hosts.deny中是否禁止,如果禁止那么就禁止连入。两个配置文件的关系为:/etc/hosts.allow的设定优先于/etc/hosts.deny二、支持服务hosts.allow和hosts.deny规则的......
  • 实现基于MYSQL验证的vsftpd虚拟用户访问
     #利用pam_mysql模块可以实现基于MySQL的FTP虚拟用户功能#项目网站:http://pam-mysql.sourceforge.net/#说明:因为此项目年代久远不再更新,当前只支持CentOS6,7,不支持CentOS8环境准备:本实验在两台主机上实现一台作为FTP服务器centos7一台作为mariadb......
  • 使用rewrite规则实现将所有到a域名的访问rewrite到b域名
     [root@centos8~]#vim/apps/nginx/conf/conf.d/mobile.confserver{listen80;server_namewww.a.com;location/{root"/data/nginx/html/mobile";indexindex.html;rewrite/http://www.b.comredi......
  • 编译安装http2.4,实现可以正常访问
    #1安装相关包[15:51:32root@centos8~]#dnfinstallgccmakeautoconfapr-develapr-util-develpcre-developenssl-develredhat-rpm-config-y​#2下载并解压包[15:53:11root@centos8~]#wgethttps://archive.apache.org/dist/httpd/httpd-2.4.46.tar.bz2[15:55:34roo......
  • 访问远程zip并解析csv
    publicList<Info>exportsCode(StringorderNo){List<Info>infoResponses=newArrayList<Info>();Stringtoken=queryToken();if(StringUtils.isBlank(token)){returnexportsCod......
  • 访问控制列表的应用
    公司网络拓扑 公司网络建设要求 使用C类地址规划网络、每个部门使用一个VLAN为设备分配管理地址限定不同的部门能访问的服务器财务部只能访问财务部服务器生产部只能访问生产部服务器限制Telnet登录,登录用户名为benet,密码为test只有网管可以使用远程桌面、Telnet、SSH等登录方......
  • 服务器没有开放3306端口 远程访问MySQL数据库方法
    一、前言​当装有MySQL的服务器为了防止数据库被黑,提高安全性,把3306端口禁止掉,禁止对外访问,我之前写过一篇是借助跳板机的SSH隧道来访问实现安全,这种情况依然需要开放3306端口和使用一个额外的跳板机,比较麻烦,后来,突发奇想,直接使用MySQL所在服务器来做SSH隧道,并且使用localho......
  • 从GPU的内存访问视角对比NHWC和NCHW
    NHWC和NCHW是卷积神经网络(cnn)中广泛使用的数据格式。它们决定了多维数据,如图像、点云或特征图如何存储在内存中。NHWC(样本数,高度,宽度,通道):这种格式存储数据通道在最后,是TensorFlow的默认格式。NCHW(样本数,通道,高度,宽度):通道位于高度和宽度尺寸之前,经常与PyTorch一起使用。......