我正疯狂地试图在Code Golf Stack Exchange上运行一场编程竞赛。我写了一个小控制程序,让动物在游戏板上相互对抗。这些动物大多是其他人编写的Java类(CrazyWolf.Java、SuicideWolf.Java等)。
那些家伙在比赛中发现了很多漏洞,这会让你大吃一惊。他们中的一些人开始写《狼队》,在模拟开始之前就用反思来削弱比赛。
我从两个角度来看待这个问题。
- 我可以保护同一包中的类不受反射吗
- 竞争对手自己能保护自己的战狼不受反思吗
关于第一个问题,我在Stack Overflow上能找到的最接近的答案是这个问题,它解决了限制访问其他包的问题。所有的wolves都继承自同一个Animal
类,因此该类必须是可访问的。
关于第二个问题,我一无所获。反思似乎践踏了我所知道的关于私人甚至最终变量的一切。我确实找到了一篇关于欺骗编译器用不受反射影响的常量替换静态最终变量的文章,但这似乎不可靠,并且要求字段是静态的和最终的。
我可以用什么方法来解决这个问题?我使用的是Java 8和NetBeans 7.4。
最简单的方法是在受保护的沙箱模式下运行,并让安全管理器完全关闭反射。
这里的一些答案可能会有所帮助:
禁用当前线程的Java反射