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