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

交换两个局部变量Integer的值

时间:2017-10-14 20:00:53      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:col   变量   ssi   tde   ack   rgs   访问   public   通过   

反射是很强大的,谁说的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();
        }
        
        
    }

}

 

交换两个局部变量Integer的值

标签:col   变量   ssi   tde   ack   rgs   访问   public   通过   

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

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