【发布时间】:2010-10-20 12:02:29
【问题描述】:
我知道这通常很愚蠢,但在阅读问题之前不要开枪打我。我保证我有充分的理由需要这样做:)
可以使用反射修改 Java 中的常规私有字段,但是当尝试对 final 字段执行相同操作时,Java 会引发安全异常。
我假设这是严格执行的,但我想我还是会问一下,以防万一有人想出了一个黑客来做到这一点。
假设我有一个带有“SomeClass”类的外部库
public class SomeClass
{
private static final SomeClass INSTANCE = new SomeClass()
public static SomeClass getInstance(){
return INSTANCE;
}
public Object doSomething(){
// Do some stuff here
}
}
我本质上想对 SomeClass 进行猴子补丁,以便我可以执行我自己的 doSomething() 版本。由于(据我所知)在 java 中没有任何方法可以真正做到这一点,因此我唯一的解决方案是更改 INSTANCE 的值,以便它使用修改后的方法返回我的类版本。
基本上我只想用安全检查包装调用,然后调用原始方法。
外部库总是使用getInstance() 来获取这个类的一个实例(即它是一个单例)。
编辑:澄清一下,getInstance() 是由外部库调用的,而不是我的代码,所以仅仅子类化并不能解决问题。
如果我不能这样做,我能想到的唯一其他解决方案是复制粘贴整个类并修改方法。这并不理想,因为我必须让我的 fork 与库的更改保持同步。如果有人有一些更易于维护的东西,我愿意接受建议。
【问题讨论】:
-
可惜Java中没有任何扩展方法
-
我冒昧地在 getInstance() 中添加了“静态”,因为它可能看起来就是这样。
-
啊,谢谢 Saua,你是对的。我的错。
-
我相信这是stackoverflow.com/questions/289702/…的完全相同的副本
-
修复你的代码:private static final SomeClass INSTANCE = new SomeClass();
标签: java monkeypatching