不知道朋友在哪裡看到的問題,qq來問我,題目是:在不修改主方法的前提下使用一個方法交換兩個int的值,方法如下: swap可以隨意修改,但是主方法不能動。 看題目想也沒想直接寫了一個方法,寫完運行結果還是沒變,代碼如下: 1 public static void swap(int a,int b){ ...
不知道朋友在哪裡看到的問題,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
成功!