交換兩個局部變量Integer的值


反射是很強大的,誰說的final修飾的就不能改變,

通過反射獲取成員變量,之后可以取消訪問修飾符,也就是說private的也可以訪問,

在修改常量(final修飾的),之后就可以對其做任何操作了

如下,通過一個方法交換兩個Integer對象的值:

package ni.jun.yang.test;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class Test {

    public static void main(String[] args) {
        Integer a = 10;
        Integer b = 20;
        System.out.println("交換前:a="+a+",b="+b);        
        change(a,b);        
        System.out.println("交換后:a="+a+",b="+b);
    }
    public static void change(Integer a, Integer b) {
    
//        System.out.println("交換后:a="+b+",b="+a);
//        System.exit(0);
        try {
            Field field = Integer.class.getDeclaredField("value");
            field.setAccessible(true); //取消訪問修飾符
            //public final class Field extends AccessibleObject implements Member
            //值為 true 則指示反射的對象在使用時應該取消 Java語言訪問檢查。
            //值為 false 則指示反射的對象應該實施 Java語言訪問檢查。            
            //修改常量(final)
            Field modifiersField = Field.class.getDeclaredField("modifiers");
            modifiersField.setAccessible(true);
            modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
            //交換
            int temp = b;
            field.set(b, a);
            field.set(a, new Integer(temp));
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM