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

    代码

    	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);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    运行测试

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    报错解决 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
    
    • 1

    在这里插入图片描述

    由于 JDK 8 中有关反射相关的功能自从 JDK 9 开始就已经被限制了,如:通过反射修改 String 类型变量的 value 字段(final byte[]),所以要能够使用运行此方法,需要在运行项目时,添加虚拟机(VM)选项:--add-opens java.base/java.lang=ALL-UNNAMED,开启默认不被允许的行为

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    基于FPGA的AHT10传感器温湿度读取
    CICD 流程学习(五)Jenkins后端工程构建
    Java类成员和函数的执行顺序(static、非static、代码块、构造函数)
    [文件共享] 电脑和设备通过网线共享文件夹
    Dijkstra算法求最短路
    【C语言】-动态内存管理
    铁托(Tito)
    【React】编程式路由,push 与 replace,withRouter,BrowserRouter 和 HashRouter 的区别
    力扣刷题 每日两题(一)
    Python一炮句搞定网页登录验证码自动输入
  • 原文地址:https://blog.csdn.net/m0_53022813/article/details/133996249