如何直接修改Integer包装类的值

2023-04-11 09:45:40

大家都知道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或者序列化去改变都应该可以。

  • 作者:qq_44142408
  • 原文链接:https://blog.csdn.net/qq_44142408/article/details/104359267
    更新时间:2023-04-11 09:45:40