码迷,mamicode.com
首页 > 其他好文 > 详细

交换基本数据类型的方法swap,并影响到主方法

时间:2017-09-13 00:22:37      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:技术分享   rgs   直接   isp   使用   bytes   tde   stack   分享   

不知道朋友在哪里看到的问题,qq来问我,题目是:在不修改主方法的前提下使用一个方法交换两个int的值,方法如下:

    public static void main(String[] args) {
        Integer a = 1;
        Integer b = 2;
        System.out.println("交换前:a="+a+",b="+b);
        swap(a,b);
        System.out.println("交换后:a="+a+",b="+b);
    }
    
    /**
     * 交换方法
     * @param a
     * @param b
     */
    public static void swap(int a,int b){
        
    }

swap可以随意修改,但是主方法不能动。

看题目想也没想直接写了一个方法,写完运行结果还是没变,代码如下:

技术分享
1     public static void swap(int a,int b){
2         int temp = a;
3         a = b;
4         b = temp;
5     }
View Code

发现我们修改的值,与原来的实际值并不相同。于是尝试使用反射修改。

说做就做,首先遍历出了所有的字段

技术分享
1         Field[] f = Integer.class.getDeclaredFields();
2         for(int i=0;i<f.length;i++){
3             System.out.println(f[i].getName());
4         }
View Code

结果如下

MIN_VALUE,MAX_VALUE,TYPE,digits,DigitTens,DigitOnes,sizeTable,value,SIZE,BYTES,serialVersionUID

发现其中有个value字段,发现值就存在该字段中,于是使用反射来改变该字段的值

技术分享
 1     public static void swap(int a,int b){
 2         try {
 3             int temp = a;//临时变量
 4             Field f =  Integer.class.getDeclaredField("value");//获取integer存放值的value
 5             f.setAccessible(true);//去除private限制
 6             f.setInt(a, b);
 7             f.setInt(b, temp);
 8         } catch (Exception e) {
 9             e.printStackTrace();
10         }
11     }
View Code

执行结果

交换前:a=1,b=2
交换后:a=2,b=1

成功!

交换基本数据类型的方法swap,并影响到主方法

标签:技术分享   rgs   直接   isp   使用   bytes   tde   stack   分享   

原文地址:http://www.cnblogs.com/bin-k/p/7512632.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!