public class ReflectTest3 {
private final String str="ABC";
/*
* public ReflectTest3(String str){ this.str=str; }
*/
public String getStr() {
return str;
}
/**
*
* @param args
*
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
ReflectTest3 rt = new ReflectTest3();
System.out.println("---打印改变前的str字符串的值---");
System.out.println(rt.str);// 打印出来ABC
System.out.println(rt.str.hashCode());
rt.change(rt.str);
System.out.println("---打印改变后的str字符串的值---");
System.out.println(rt.str);// 打印出来还是ABC,没有被改变
System.out.println(rt.str.hashCode());
}
/**
*
* 试图改变obj对象里的的字符串成员
*
* @param obj
*
* @throws Exception
*/
public void change(String str) throws Exception
{
Class cls = str.getClass();// 获得str的Class对象
Field fil = cls.getDeclaredField("value");// 获得String类中的char数组value[]的Filed变量
fil.setAccessible(true);// 由于value变量是一个private的所以设置权限
char[] ch = { 'D', 'S', 'W', 'Q' };
fil.set(str, ch);// 改变value所指向的数组,使value指向ch数组
}
}
这个输出结果可以改变private final String str="ABC";的值,final好像只是能够使对象的hashCode值不变。 |