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



相关推荐
莫逸风1 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
z123456789862 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin5211232 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
做个文艺程序员3 小时前
Linux第24篇:Java应用监控体系搭建:Prometheus+Grafana可视化运维
java·grafana·prometheus
小钻风33663 小时前
Spring Boot 文件上传详解:深入理解 MultipartFile 的使用与原理
java·开发语言
其美杰布-富贵-李3 小时前
Spring Boot 工程开发全流程说明
java·spring boot·后端
前端双越老师5 小时前
如何以前端视角(非0基础)学 Java ?
java·node.js·全栈
dear_bi_MyOnly5 小时前
【SpringBoot配置文件】
java·spring boot·后端·学习·spring·java-ee·学习方法
做个文艺程序员5 小时前
Linux第22篇:用Docker容器化你的Java SaaS应用:一次构建,随处运行
java·docker·容器
其美杰布-富贵-李6 小时前
Spring Boot 依赖注入说明文档
java·spring boot·python