Java内存地址基本数据类型的值互换问题

因为基本数据类型是值传递的,所以如果值互换会导致获得一样的值,这时需要使用反射来进行解决问题。

public class SwapDemo {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        Integer a = 1, b = 2;
        System.out.println("before:a = " + a + " b=" + b);//预期:a = 1, b = 2
        //a和b值互换
        swap(a,b);
        System.out.println("after:a=" + a + " b=" + b);//预期:a = 2, b = 1
    }
    public static void swap(Integer i1, Integer i2) throws NoSuchFieldException, IllegalAccessException {
        //通过反射原理来进行值的改变
        //因为Integer内部是一个final 的 int 基本数据类型,所以这是值传递,不能改变
        Field field = Integer.class.getDeclaredField("value");
        field.setAccessible(true);
        Integer temp = new Integer(i1.intValue());//这一步很关键,这是需要改变原来i1的地址值,否则temp会因为下一步变为2
        field.set(i1,i2.intValue());
        field.set(i2,temp);
    }

 

posted @ 2021-05-08 23:43  WK_BlogYard  阅读(226)  评论(0编辑  收藏  举报