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