✅反射与封装是否矛盾?如何解决反射破坏封装不安全的问题?
典型回答
封装、继承、多态是面向对象的基本原则,是 Java 的基础,封装目的是隐藏对象的内部实现细节,只暴露必要的接口,从而保护数据的完整性和安全性。
而反射是一种可以在运行期动态的访问、修改类的方法和属性的方式。而且反射是可以访问到一个类内部定义的私有的成员变量和方法的。所以,反射确实是可以破坏封装的保护机制的。
但是反射和封装达不到说矛盾的地步,可以认为基本原则就是要封装,而在一些特殊情况下,比如一些框架的底层处理上,是需要一种机制可以打破封装的桎梏的。
如何解决反射导致封装被破坏的问题,这个东西,只能从反射上入手,封装上面没啥能干的。而且能做的也就是通过一些使用规范来做约束。
比如,最小化反射原则,就是在非必要情况下,尽可能不要使用反射,尤其是在业务代码中,不要使用反射,只能在框架设计中使用。如果一定要使用反射,也只针对涉及到的字段和方法做反射。
还可以通过白名单机制,限制反射只能访问特定的类和成员。例如,在框架中设计时,明确允许反射访问的类和字段清单,避免任意访问不该暴露的成员。(比如我介绍过 fastjson 的 autotype 的反序列化的白名单机制,大致就是这个思想:https://www.yuque.com/hollis666/sza8tg/sexwwk)
还有就是依赖 CodeReview 了,在代码审查的时候严格的对反射进行审查。