今天在看Spring in Action,看到了一個很有意思的例子。
假如你編寫了一個類:
public class ClassA{
??????private String fieldA;
??????public ClassA(){
?????????fieldA = "This is Class A";
???? }
??????public myPrint(){
????????????System.out.println(fieldA);
??????}
}
OK。按照面向?qū)ο蟮乃枷耄渌念悜摬荒軌蛐薷腃lassA的fieldA字段吧?因此無論什么時候你調(diào)用ClassA的myPrint方法,都應該打印的是“This is Class A”。
??????但是,實際情況并不是如此,請看下面的例子:
import java.lang.reflect.Field;
public class? TestChangeApp
{
????public static void main(String[] args)
????{
????????System.out.println("Begin to test change.");
????????ClassA test = new ClassA();
????????test.myPrint();
????????Field[] fields = test.getClass().getDeclaredFields();
??
????????try
????????{
????????????for (int i=0;i????????????{
??????????????? if (fields[i].getType().equals(java.lang.String.class)){
???????????????????fields[i].setAccessible(true);
???????????????????fields[i].set(test, "This field have been changed!");
???????????????}
????????????}
???
????????}
????????catch (Exception e)
????????{
????????}
????????test.myPrint();
????}
}
運行結(jié)果是什么呢?是
Begin to test change.
This is ClassA
This field have been changed!
也就是說,在TestChangeApp類中,可以修改ClassA的私有成員變量。