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

news/2024/5/19 3:41:06 标签: java, Java, java-ee, 反射, String, javase

注意点

  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);
    }

运行测试

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

javalangStringvalue_accessible_27">报错解决 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,开启默认不被允许的行为

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


http://www.niftyadmin.cn/n/5115362.html

相关文章

uni-app 小宠物 - 会说话的小鸟

在 template 中 <view class"container"><view class"external-shape"><view class"face-box"><view class"eye-box eye-left"><view class"eyeball-box eyeball-left"><span class"…

1978-2021年全国各省有效灌溉面积数据

1978-2021年全国各省有效灌溉面积数据 1、时间&#xff1a;1978-2021年 2、来源&#xff1a;农业统计NJ、各省NJ、国家统计J 3、指标&#xff1a;有效灌溉面积 4、范围&#xff1a;31省市 5、指标解释&#xff1a; 有效灌溉面积指具有一定的水源&#xff0c;地块比较平整…

Java 线程池调度周期性任务“异常“探究

背景 在做性能监控需求的过程中&#xff0c;会存在很多监控任务需要定时执行。比如在卡顿监控的实现中&#xff0c;我们需要每50ms 执行一次主线程调用栈的任务&#xff0c;此时由于任务本身可能存在一些耗时&#xff0c;可能需要对任务下次调度的时间做一些调整&#xff0c;避…

Java赋值运算符(=)

赋值运算符是指为变量或常量指定数值的符号。赋值运算符的符号为“”&#xff0c;它是双目运算符&#xff0c;左边的操作数必须是变量&#xff0c;不能是常量或表达式。 其语法格式如下所示&#xff1a; 变量名称表达式内容 在 Java 语言中&#xff0c;“变量名称”和“表达式…

【Java集合类面试六】、 HashMap有什么特点?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;HashMap有什么特点&…

轻量级自动化测试框架WebZ

一、什么是WebZ WebZ是我用Python写的“关键字驱动”的自动化测试框架&#xff0c;基于WebDriver。 设计该框架的初衷是&#xff1a;用自动化测试让测试人员从一些简单却重复的测试中解放出来。之所以用“关键字驱动”模式是因为我觉得这样能让测试人员&#xff08;测试执行人员…

【Python · PyTorch】数据基础

数据基础 1. 数据操作1.1 入门1.2 运算符1.3 广播机制1.4 索引和切片1.5 节省内存1.6 转化为其他Python对象 2. 数据预处理2.1 读取数据集2.2 处理缺失值2.3 转换为张量格式 本文介绍了PyTorch数据基础&#xff0c;Python版本3.9.0&#xff0c;代码于Jupyter Lab中运行&#xf…

通过热敏电阻计算温度(二)---ODrive实现分析

文章目录 通过热敏电阻计算温度&#xff08;二&#xff09;---ODrive实现分析测量原理图计算分析计算拟合的多项式系数根据多项式方程计算温度的函数温度计算调用函数 通过热敏电阻计算温度&#xff08;二&#xff09;—ODrive实现分析 ODrive计算热敏电阻的温度采用的时B值的…