sys mem spa stat red cep java语言 odi 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();
- }
- }
- }
交换两个局部变量Integer的值
来源: http://www.bubuko.com/infodetail-2351297.html