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



相关推荐
Oneforlove_twoforjob6 分钟前
【Java基础面试题033】Java泛型的作用是什么?
java·开发语言
向宇it22 分钟前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
小蜗牛慢慢爬行25 分钟前
Hibernate、JPA、Spring DATA JPA、Hibernate 代理和架构
java·架构·hibernate
星河梦瑾1 小时前
SpringBoot相关漏洞学习资料
java·经验分享·spring boot·安全
黄名富1 小时前
Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
java·数据库·redis·lua
love静思冥想1 小时前
JMeter 使用详解
java·jmeter
言、雲1 小时前
从tryLock()源码来出发,解析Redisson的重试机制和看门狗机制
java·开发语言·数据库
TT哇2 小时前
【数据结构练习题】链表与LinkedList
java·数据结构·链表
Yvemil72 小时前
《开启微服务之旅:Spring Boot 从入门到实践》(三)
java
Anna。。2 小时前
Java入门2-idea 第五章:IO流(java.io包中)
java·开发语言·intellij-idea