本帖最后由 汤瑞贺 于 2012-11-19 01:53 编辑
不知不觉看此贴一个多小时过去了,又写了一个多小时(下面是自己的小理解,可能不准确,欢迎提意见{:soso_e100:})
感觉你的观点“字符串不可变”是理解就是有点不对的吧!
楼主所写得用反射代码所实现的效果和下面面这几行代码效果雷同吧,这样不就“证明了-->把字符串该变了吗”,用反射岂不多此一举?当然我认为你没改变。- class StringChange
- {public static String str="ABC";
- public static void main(String[] args)
- {
- System.out.println("---打印改变前的str字符串的值---");
- System.out.println(str);//打印出来ABC
- str="CBA";
- System.out.println("---打印改变后的str字符串的值---");
- System.out.println(str);//打印出来CBA
- }
- }
复制代码
- /*
- 下面测试一下你的代码
- 只在change(String str)函数里添加一句代码,就改不掉了...
- */
- import java.lang.reflect.Field;
- public class StringChange {
-
- static String str="ABC";</P>
- /**
- * @param args
- * @throws Exception
- */
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
-
- System.out.println("---打印改变前的str字符串的值---");
- System.out.println(str);//打印出来ABC
-
- change(str);//改变String变量的值
-
- System.out.println("---打印改变后的str字符串的值---");
- System.out.println(str);//打印出来CBA
-
- }
-
- /**
- * 该方法运用反射原理改变了传入的参数的值,具体来说就是改变了字符串的值
- * @param str
- * @throws Exception
- */
- public static void change(String str)throws Exception
- { str="任意一个不同于初始化的字符串";//这样就改不了
- Class cls=str.getClass();//获得str的Class对象
- Field fil=cls.getDeclaredField("value");//获得String类中的char数组value[]的Filed变量
- fil.setAccessible(true);//由于value变量是一个private的所以设置权限
-
- char[] ch={'C','B','A'};
- fil.set(str, ch);//改变value所指向的数组,使value指向ch数组
- }
- }
复制代码 至此,图示你代码所实现的功能:
你只是改变了str指向(这就像C语言中的指针)str不是字符串,str指向的变量才是字符串,即上图矩形框,“矩形框”才是字符串变量(实则内存地址吧,没查资料自己理解),“矩形框里的内容”才是变量的值,这个是改变不了的..........
ps: String str1="ABC";
String str2="ABC";
|