反射是很強大的,誰說的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();}}}
?