既然Java反射可以访问和修改私有成员变量,那封装成private还有意义么?

admin 124 0

很高兴能回答你的问题:

  1. 简单来说,private并不是解决“安全”问题的。
  2. 安全是指不让代码被非法看到/访问。但是只要人能拿到代码,总会有办法去查看和改变代码。
  3. private想表达的不是“安全性”的意思,而是OOP的封装概念,是一种编译器可以帮助你的设计。这就像是一家没人的店挂了个牌子“闲人免进”,但你真要进去还是有各种办法可以办到。所以private,以及所有其他的access modifier都有一层隐含的含义:如果你按照遵守这套规则,开发者可以保证不问题(不考虑bug的情况下);否则,后果自负。
  4. 比如,你在用spring的IoC的时候,你知道你要“注入”,不管它是不是private的,你知道“注入”是你自己控制的,是你设计好的效果。那么通过spring的IoC利用反射帮你注入一些private property是再正常不过的用法。
  5. 再比如,单元测试,你就想测一个private方法。但是因为private的缘故就是测不了。于是你可以用反射绕开这个限制,开心的做测试。

总上所述,private只是个约定而已。

标签: #Java反射