大家都知道Integer包装类的值一般常规操作是修改不了,至于用new对象的方式创建的,大家可以看下hashcode值便知道了。
今天,给大家拓展下思路。我选择的是反射作为前提技术的修改方式,不过大家还阔以调用c去直接操作应该也是可以的。我就没尝试了。话不多说。我来给大家上代码操作下。
//初始化一个Integer对象
Integer integer_test=123;
/*
*字符数组名 digits
* final static char[] digits = {
'0' , '1' , '2' , '3' , '4' , '5' ,
'6' , '7' , '8' , '9' , 'a' , 'b' ,
'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
'o' , 'p' , 'q' , 'r' , 's' , 't' ,
'u' , 'v' , 'w' , 'x' , 'y' , 'z'
};
* 利用反射获取Integer包装类的字符数组,这个字符数组,组装成了
* 可以包括任何在int类型范围内的数字。为它们提供一个引用。我们现在
* 就是要修改这个数组,完成对引用对应数值的引用,从而改变值
* */
Field field =integer_test.getClass().getDeclaredField("digits");
field.setAccessible(true);
char[] chars=(char[])field.get(integer_test);
//修改引用1的值,以下类推
chars[1]='2';
chars[2]='3';
chars[3]='5';
System.out.println(integer_test);//原来值123 ,打印结果235
但是,有一个缺点。这个改动是和程序的生命周期是一样的。所以不推荐使用,大家可以尝试用c或者序列化去改变都应该可以。