自动生成包装以防止"恶意贬低"?

Thi*_*ilo 2 java delegates code-generation

如果在Java中实现接口,则没有什么可以阻止调用者查看您提供的具体实现,转换为该类并调用不在接口中的方法.我相信这被称为"恶意贬低".

防止这种情况的一种方法是创建一个只包含接口方法的包装器,并且不公开它所委托的实现实例.如果没有对私有变量的反思,你应该是安全的.

有没有办法自动创建这种包装器(在运行时,不使用IDE中的代码创建向导,因为仍然会创建需要维护的源文件)?

Jam*_*ack 8

另一种防止这种情况的方法是使用工厂类,并将实现作为工厂的私有内部类.只有工厂可以看到它,它只返回接口类型,因此没有具体的实现可以反对.

  • (提示:在Java的权限系统中,私有内部/嵌套类仍然是package-private;如果已知,则可以使用反射来获取具体类型,以及调用类是否在正确的包中.) (2认同)

Chr*_*ung 7

我喜欢James Black的答案,但为了多样性,我会发布另一种方法.

你可以java.lang.reflect.Proxy用来做这件事.请参阅这篇文章,了解我编写的一些代码(针对不同的问题)Proxy; 你可以使用类似的代码,如果你删除同步的东西.