交换两个局部变量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();
        }
        
        
    }

}
原文地址:https://www.cnblogs.com/nijunyang/p/7668179.html