Java中使用反射实现两数交换遇到的坑(一)
今天使用反射实现两数交换的时候,遇到个有趣的问题,记录一下~
直接上代码~
//使用反射交换两个整数
private static void swap(Integer i, Integer j) {
Integer temp = i;
try {
Field field = i.getClass().getDeclaredField("value");
field.setAccessible(true);
field.setInt(i,j);
field.setInt(j,temp);
System.out.println(temp);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Integer i = 1;
Integer j = 2;
swap(i,j);
System.out.println("i:" + i);
System.out.println("j:" + j);
}
看完代码,猜猜结果是啥,是预期的两数交换吗?
.
.
.
.
.
.
.
.
.
.
结果总是事与愿违呀,哈哈哈~
结果竟然跟预期的不一样,那说明上面的代码是存在问题的,你看出来吗?
相信一些大佬,第一眼就发现问题所在了~
Integer temp = i;
这句话有明显的逻辑错误,它等价于Integer temp = Integer i;
,懂了吗?
但是程序检查不出来,那问题又来了,为什么结果都是2呢?
.
.
这是因为Integer temp = i;
这句话将i的地址赋值给了temp,相当于temp也指向了i的地址,当i的值发生改变的时候,temp也发生了改变~
图解:
最开始
执行Integer temp = i;
执行field.setInt(i,j);
执行field.setInt(j,temp);
到这应该懂了吧,欢迎大家评论学习~