主页 > 其他  > 

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

Java通过反射修改字符串String类型变量的取值而不改变字符串变量的指向
注意点 由于 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); // 获取字符串变量的 Class Class<?> 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类型变量的取值而不改变字符串变量的指向由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Java通过反射修改字符串String类型变量的取值而不改变字符串变量的指向