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 字段

代码

java 复制代码
	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

java 复制代码
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,开启默认不被允许的行为



相关推荐
bug菌19 分钟前
Java GUI编程进阶:多线程与并发处理的实战指南
java·后端·java ee
程序猿小D32 分钟前
第二百六十九节 JPA教程 - JPA查询OrderBy两个属性示例
java·开发语言·数据库·windows·jpa
极客先躯1 小时前
高级java每日一道面试题-2024年10月3日-分布式篇-分布式系统中的容错策略都有哪些?
java·分布式·版本控制·共识算法·超时重试·心跳检测·容错策略
夜月行者2 小时前
如何使用ssm实现基于SSM的宠物服务平台的设计与实现+vue
java·后端·ssm
程序猿小D2 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa
潘多编程2 小时前
Java中的状态机实现:使用Spring State Machine管理复杂状态流转
java·开发语言·spring
_阿伟_2 小时前
SpringMVC
java·spring
代码在改了2 小时前
springboot厨房达人美食分享平台(源码+文档+调试+答疑)
java·spring boot
猿java3 小时前
使用 Kafka面临的挑战
java·后端·kafka
wclass-zhengge3 小时前
数据结构篇(绪论)
java·数据结构·算法