private修饰的方法可以通过反射访问,那么private的意义是什么?
在Java当中,如果为了我们不想让别人访问某些属性、方法,我们通常的做法是使用private关键字进行修饰。但是Java语言在设计时却允许通过反射来进行访问,只需要关掉访问检查就可以了。
import java.lang.reflect.Field;
public class Test {
public static void main(string[] args) {
C c = new C();
try {
Field f = C.class.getDeclaredField("a");
f.setAccessible(true);
Integer i = (Integer)f.get(c);
System.out.println(i);
} catch (Exception e) {}
}
}
class C {
private Integer a = 6;
}
那么private修饰符不是失去了它原本的意义了吗?
其实不尽然,本身private修饰符是基于OOP思想下封装概念的一种体现,对于使用者而言是一种约束,并不是一种安全机制。就好比说,你在道路上行驶,导航时不时提醒你限速,这是道路交通法的规定,但是救护车碰上情况是不是也会超速对吧,这个就是这两者的差异。
你在用Spring的IoC的时候,你知道你要“注入”,不管它是不是private的,都能够注入进去对吧。
如果你按照遵守这套规则,开发者在不考虑bug的情况下可以保证不出问题,否则就很有可能在你意想不到的地方带来灾难性的后果。
![](/images/780-200-2.jpg)