关于Java的封装性

关于Java的封装性

今天在看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的私有成员变量。

你可能感兴趣的:(关于Java的封装性)