已解决
Java 通过反射修改字符串 String 类型变量的取值而不改变字符串变量的指向
来自网友在路上 177877提问 提问时间:2023-10-24 03:30:18阅读次数: 77
最佳答案 问答题库778位专家为你答疑解惑
注意点
- 由于 JDK 8 中有关反射相关的功能自从 JDK 9 开始就已经被限制了,如:通过反射修改 String 类型变量的 value 字段(final byte[]),所以要能够使用运行此方法,需要在运行项目时,添加虚拟机(VM)选项:
--add-opens java.base/java.lang=ALL-UNNAMED
,开启默认不被允许的行为 - 在修改 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
,开启默认不被允许的行为
查看全文
99%的人还看了
猜你感兴趣
版权申明
本文"Java 通过反射修改字符串 String 类型变量的取值而不改变字符串变量的指向":http://eshow365.cn/6-22937-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: 蓝桥杯每日一题0223.10.23
- 下一篇: node快速搭建一个学习资料共享平台