例子:
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
大神写的,传送门