Java 通过反射修改字符串 String 类型变量的取值而不改变字符串变量的指向

编程入门 行业动态 更新时间:2024-10-10 15:26:22

Java 通过反射修改<a href=https://www.elefans.com/category/jswz/34/1771434.html style=字符串 String 类型变量的取值而不改变字符串变量的指向"/>

Java 通过反射修改字符串 String 类型变量的取值而不改变字符串变量的指向

注意点

  1. 由于 JDK 8 中有关反射相关的功能自从 JDK 9 开始就已经被限制了,如:通过反射修改 String 类型变量的 value 字段(final byte[]),所以要能够使用运行此方法,需要在运行项目时,添加虚拟机(VM)选项:--add-opens java.base/java.lang=ALL-UNNAMED,开启默认不被允许的行为
  2. 在修改 String 类型变量的 value 字段的值时,不要使用 strValueField.set(str, strValue.getBytes(StandardCharsets.UTF_8));,会出现乱码,要采用:获取要修改成的字符串字面量的 value 字段值,将其赋值给要修改的字符串变量的 value 字段

代码

	public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {String str = "修改前的字符串变量取值";System.out.println(str);// 获取字符串变量的 ClassClass<?> strClass = str.getClass();// 获取字符串变量对应的 Class 中的 value 字段Field declaredField = strClass.getDeclaredField("value");// 保证获取的字段能够被访问declaredField.setAccessible(true);String newStr = "修改后的字符串变量取值";// 修改字符串变量的 value 字段的取值declaredField.set(str, declaredField.get(newStr));System.out.println(str);}

运行测试



报错解决 Unable to make field private final byte[] java.lang.String.value accessible

Unable to make field private final byte[] java.lang.String.value accessible: module java.base does not "opens java.lang" to unnamed module @3d646c37

由于 JDK 8 中有关反射相关的功能自从 JDK 9 开始就已经被限制了,如:通过反射修改 String 类型变量的 value 字段(final byte[]),所以要能够使用运行此方法,需要在运行项目时,添加虚拟机(VM)选项:--add-opens java.base/java.lang=ALL-UNNAMED,开启默认不被允许的行为



更多推荐

Java 通过反射修改字符串 String 类型变量的取值而不改变字符串变量的指向

本文发布于:2023-12-04 04:03:11,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1659699.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:字符串   变量   而不   反射   类型

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!