java反射 修改静态方法的值 setAccessible
转载自 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相关推荐
- java 反射修改final变量_Java中final的属性值怎么利用反射机制进行修改
Java中final的属性值怎么利用反射机制进行修改 发布时间:2020-12-02 17:31:07 来源:亿速云 阅读:96 作者:Leah 今天就跟大家聊聊有关Java中final的属性值怎么利 ...
- JAVA反射修改常量,以及其局限
转载自 JAVA反射修改常量,以及其局限 问题,以及一个解决方案 今天公司的JAVA项目碰到一个问题:在生成xls文件的时候,如果数据较多,会出现ArrayIndexOutOfBoundsExcept ...
- java反射 获取Object属性值
项目场景: 一个添加员工信息的功能,通过shiro获取当前登录用户的信息,取出其中的createId的值,在通过set方法写入. 问题描述: 通过获取的登录用户的信息发现,它是一个Object对象,然 ...
- Java 反射修改类的常量值、静态变量值、属性值
前言 有的时候,我们需要修改一个变量的值,但变量也许存在于 Jar 包中或其他位置,导致我们不能从代码层面进行修改,于是我们就用到了下面的场景,通过反射来进行修改变量的值. 定义一个实体类 class ...
- java反射成员变量的值_Java反射如何修改private final成员变量值
大家都知道使用java反射可以在运行时动态改变对象的行为,甚至是private final的成员变量,但并不是所有情况下,都可以修改成员变量.今天就举几个小例子说明. 基本数据类型 /** * @au ...
- java 反射 修改字段_Java反射机制-修改字段值
需要用到的类: Field 需要用到的方法: getDeclaredField(); getField(); setAccessible(); 需要用到的字段: public int a=5; pub ...
- java 反射调用静态方法
使用包装类Integer中的静态方法parseInt ,如果使用java反射来进行调用 调用实例: public static void main(String[] args) throws Ille ...
- java 反射父类私有属性值_如何在Java中通过反射访问父类的父类的私有字段? - java...
在一个API中,我使用的是一个抽象类(A类),该类具有一个私有字段(A.privateField). B类在API中扩展了A类. 我需要扩展B类的实现,即C类,但是我需要A类的privateField ...
- Java反射修改返回值_java反射调用时如果返回值是整型数组怎么处理?
想通过java的反射功能将javaBean转换成map: public static Map toMap(Object javaBean) { Map result = new HashMap< ...
最新文章
- 团队作业—第二阶段06
- 超全Python速查表登上GitHub热榜,标星4600+!(附链接)
- linux内核丢弃udp报文,c++ Linux UDP数据包丢失的原因
- Linux TCP/IP中L4L3的实现框架:udp send部分
- 普通二本的辛酸Android面试之路,满满干货指导
- matlab实训心得体会,MatLab实习心得体会
- 谈一下今天的网络赛。。。这次是真的弱爆了。。。。
- CSS从入门到精通(CSS背景和列表)
- 机器学习- 吴恩达Andrew Ng 编程作业技巧 for Week3
- 基于java springboot android安卓商城购物平台源码(毕设)
- Windows的隐藏分区
- ORA-01033错误解决方法
- matlab绘正态/卡方/t/F分布概率密度图
- 基于.NET平台的分层架构实战(九)——数据访问层的第三种实现:基于NBear框架的ORM实现
- 苹果计算机使用方法,不知道这10个Mac使用技巧,别说你会用苹果电脑
- JavaScript对象的声明及操作
- 修改文件扩展名(只需四步)
- Thin LUN 和 Thick LUN
- zookeeper基本讲解(Java版,真心不错)
- 靶机13 VEGETA: 1
热门文章
- 深圳店匠笔试题-4.01
- [JavaWeb-XML]XML概述
- [蓝桥杯2015决赛]奇怪的数列-双指针+模拟
- pythonwhile循环怎么修改数据类型_python基础--数据类型循环
- icoding复习7, 8
- 操作系统——内存管理——分段和分页
- Redis学习之Docker环境搭建
- 【BZOJ4028】[HEOI2015]公约数数列(分块/数量级很小法)
- AGC019D - Shift and Flip(枚举)
- CF917C. Pollywog