今天在看Spring in Action,看到了一个很有意思的例子。
假如你编写了一个类:
public class ClassA{
private String fieldA;
public ClassA(){
fieldA = "This is Class A";
}
public myPrint(){
System.out.println(fieldA);
}
}
OK。按照面向对象的思想,其他的类应该不能够修改ClassA的fieldA字段吧?因此无论什么时候你调用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();
}
}
运行结果是什么呢?是
Begin to test change.
This is ClassA
This field have been changed!
也就是说,在TestChangeApp类中,可以修改ClassA的私有成员变量。