zoukankan      html  css  js  c++  java
  • 交换两个局部变量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();
            }
            
            
        }
    
    }
  • 相关阅读:
    hdu 2680(最短路)
    hdu 1548(最短路)
    hdu 1596(最短路变形)
    hdu 1546(dijkstra)
    hdu 3790(SPFA)
    hdu 2544(SPFA)
    CodeForces 597B Restaurant
    CodeForces 597A Divisibility
    CodeForces 598E Chocolate Bar
    CodeForces 598D Igor In the Museum
  • 原文地址:https://www.cnblogs.com/nijunyang/p/7668179.html
Copyright © 2011-2022 走看看