转载自 java反射 修改静态方法的值 setAccessible

这几天闲来无事。在网上看了一个题目,相信大家都知道这个题目

 static void change(String str){str="welcome";}public static void main(String[] args) {String str = "123";change(str);System.out.println(str);} 

str =多少?
如果大家都知道 。。
然后我想把最后输出要“welcome”怎么做?
于是改成这样

  static String change(String str){str="welcome";return str;}

然后main里

str=change(str);这结果改了,但是改的代码太多。、
我想只能改change方法。也不需要返回值,来解决问题。先看了下

String类发现 private final char value[]; 是私有的。把这个值改了不就OK了嘛

于是想到了反射:
代码如下:

static void change(String str){try {Class<?> clazz = str.getClass();Field fields = clazz.getDeclaredField("value");Object obj = fields.get(str);char [] charValue = (char [] )obj;System.out.println(charValue); } catch (Exception e) {e.printStackTrace();}}

发现打出结果 welcome 那么只要改掉

charValue就OK了吧。于是继续加代码 发现 modifiers "private final" 会出这个错,
要加上

    field.setAccessible(true);try {Class<?> clazz = str.getClass();Field field = clazz.getDeclaredField("value");field.setAccessible(true);Object obj = field.get(str);char [] charValue = (char [] )obj;charValue = new char [3];for(int i=0;i<charValue.length;i++){charValue[i]='a';}field.set(str, charValue);} catch (Exception e) {e.printStackTrace();}

发现能满足我的要求,。值是被改了,然后我想改变长度,于是又动一下代码charValue = new char [4];

发现值不能改变 继续看String源码,发现有个count属性,。于是又了改了这个值代码如下

 try {Class<?> clazz = str.getClass();Field field = clazz.getDeclaredField("value");field.setAccessible(true);Object obj = field.get(str);char [] charValue = (char [] )obj;charValue = new char [4];for(int i=0;i<charValue.length;i++){charValue[i]='a';}Field field1 = clazz.getDeclaredField("count");field1.setAccessible(true);field1.set(str, charValue.length);field.set(str, charValue);} catch (Exception e) {e.printStackTrace();}}

发现能解决问题。
我又试了下然后我又试下Integer 发现一样可以
代码如下:

static void changeInteger(Integer a){   try {Class<?> clazz = a.getClass();Field field = clazz.getDeclaredField("value");field.setAccessible(true);field.set(a, 12312);} catch (Exception e) {e.printStackTrace();}}

个人觉得只要Field.setAccessible(true); 之后,即使是final关键字标示过得属性也可以有访问权限!这样的反射会改变JAVA的结构,甚至你的代码可维护性,你完全可以
改别的代码里面的值 ,所以这只是一个简单的例子。只是验证通过反射能做一些让你无法想象的东西。。

java反射 修改静态方法的值 setAccessible相关推荐

  1. java 反射修改final变量_Java中final的属性值怎么利用反射机制进行修改

    Java中final的属性值怎么利用反射机制进行修改 发布时间:2020-12-02 17:31:07 来源:亿速云 阅读:96 作者:Leah 今天就跟大家聊聊有关Java中final的属性值怎么利 ...

  2. JAVA反射修改常量,以及其局限

    转载自 JAVA反射修改常量,以及其局限 问题,以及一个解决方案 今天公司的JAVA项目碰到一个问题:在生成xls文件的时候,如果数据较多,会出现ArrayIndexOutOfBoundsExcept ...

  3. java反射 获取Object属性值

    项目场景: 一个添加员工信息的功能,通过shiro获取当前登录用户的信息,取出其中的createId的值,在通过set方法写入. 问题描述: 通过获取的登录用户的信息发现,它是一个Object对象,然 ...

  4. Java 反射修改类的常量值、静态变量值、属性值

    前言 有的时候,我们需要修改一个变量的值,但变量也许存在于 Jar 包中或其他位置,导致我们不能从代码层面进行修改,于是我们就用到了下面的场景,通过反射来进行修改变量的值. 定义一个实体类 class ...

  5. java反射成员变量的值_Java反射如何修改private final成员变量值

    大家都知道使用java反射可以在运行时动态改变对象的行为,甚至是private final的成员变量,但并不是所有情况下,都可以修改成员变量.今天就举几个小例子说明. 基本数据类型 /** * @au ...

  6. java 反射 修改字段_Java反射机制-修改字段值

    需要用到的类: Field 需要用到的方法: getDeclaredField(); getField(); setAccessible(); 需要用到的字段: public int a=5; pub ...

  7. java 反射调用静态方法

    使用包装类Integer中的静态方法parseInt ,如果使用java反射来进行调用 调用实例: public static void main(String[] args) throws Ille ...

  8. java 反射父类私有属性值_如何在Java中通过反射访问父类的父类的私有字段? - java...

    在一个API中,我使用的是一个抽象类(A类),该类具有一个私有字段(A.privateField). B类在API中扩展了A类. 我需要扩展B类的实现,即C类,但是我需要A类的privateField ...

  9. Java反射修改返回值_java反射调用时如果返回值是整型数组怎么处理?

    想通过java的反射功能将javaBean转换成map: public static Map toMap(Object javaBean) { Map result = new HashMap< ...

最新文章

  1. 团队作业—第二阶段06
  2. 超全Python速查表登上GitHub热榜,标星4600+!(附链接)
  3. linux内核丢弃udp报文,c++ Linux UDP数据包丢失的原因
  4. Linux TCP/IP中L4L3的实现框架:udp send部分
  5. 普通二本的辛酸Android面试之路,满满干货指导
  6. matlab实训心得体会,MatLab实习心得体会
  7. 谈一下今天的网络赛。。。这次是真的弱爆了。。。。
  8. CSS从入门到精通(CSS背景和列表)
  9. 机器学习- 吴恩达Andrew Ng 编程作业技巧 for Week3
  10. 基于java springboot android安卓商城购物平台源码(毕设)
  11. Windows的隐藏分区
  12. ORA-01033错误解决方法
  13. matlab绘正态/卡方/t/F分布概率密度图
  14. 基于.NET平台的分层架构实战(九)——数据访问层的第三种实现:基于NBear框架的ORM实现
  15. 苹果计算机使用方法,不知道这10个Mac使用技巧,别说你会用苹果电脑
  16. JavaScript对象的声明及操作
  17. 修改文件扩展名(只需四步)
  18. Thin LUN 和 Thick LUN
  19. zookeeper基本讲解(Java版,真心不错)
  20. 靶机13 VEGETA: 1

热门文章

  1. 深圳店匠笔试题-4.01
  2. [JavaWeb-XML]XML概述
  3. [蓝桥杯2015决赛]奇怪的数列-双指针+模拟
  4. pythonwhile循环怎么修改数据类型_python基础--数据类型循环
  5. icoding复习7, 8
  6. 操作系统——内存管理——分段和分页
  7. Redis学习之Docker环境搭建
  8. 【BZOJ4028】[HEOI2015]公约数数列(分块/数量级很小法)
  9. AGC019D - Shift and Flip(枚举)
  10. CF917C. Pollywog