java反射 静态变量 setAccessible

例子:

public void main(String args[]) {

String str = 'aaa';

modify(str);

system.out.println(str);

}


static void modify(String str){

str ='bbb';

}

现在要求str的输出为bbb, 因为str传的是值,不是地址,所以main方法中的str值不会变化,想要输出bbb的话,需要修改下代码

方法1:

static String modify(String str){

str = 'bbb'

return str;

}

这样修改modify方法后,main通过str = modify(str)就可以获得新的值了,但是这种方法需要改两处代码。。。。


方法2:

因为传的值是String ,是一个private final的一个值,如果只改modify方法的话,可以通过反射的方式来改变值

static void modify(String str){

try{

Class<?> clazz = str.getClass();

Field field = clazz.getDeclaredField("value"); //通过value获取属性的值

field.setAccessible(true); //通过设置true 可以访问private final属性

Object obj = field.get(str);

char[] ch = (char[]) obj;

system.out.println(ch);    //获取的值是aa


//把ch 的值修改掉,就完成了对str的修改

for(int i = 0; i < ch.length; i++){

ch[i] = 'b';

}

field .set(str,ch);

}catch(Exception e){}

}


当改变ch的长度时候,需要设置长度,Field field = clazz.getDeclaredField("hash");   获取到长度属性,然后对长度进行修改,同上,最后再修改变量的值





http://www.blogjava.net/sundc/archive/2013/06/08/400382.html

大神写的,传送门




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值