如果在Java中实现接口,则没有什么可以阻止调用者查看您提供的具体实现,转换为该类并调用不在接口中的方法。我相信这被称为“恶意贬低”。
防止这种情况的一种方法是创建一个只包含接口方法的包装器,并且不公开它所委托的实现实例。如果没有对私有变量的反思,那么你应该是安全的。
有没有办法自动创建这种包装器(在运行时,不使用IDE中的代码创建向导,因为仍然会创建需要维护的源文件)?
答案 0 :(得分:8)
另一种防止这种情况的方法是使用工厂类,并将实现作为工厂的私有内部类。只有工厂才能看到它,它只返回接口类型,因此没有具体的实现可以反对。
答案 1 :(得分:7)
我喜欢James Black的回答,但为了多样性,我会发布另一种方法。
您可以使用java.lang.reflect.Proxy
执行此操作。有关使用Proxy
的一些代码(针对其他问题),请参阅this post;你可以使用类似的代码,如果你删除同步的东西。