我正在使用第 3 方库,并且在分析过程中发现了其中的性能错误。我可以通过反编译有问题的类并将“getFoo(Bar b)”方法更改为使用 LoadingCache 来轻松解决此问题。然后我将该文件放在我自己的源代码中的同一个包中,它会覆盖它。但是,类(class)的其余部分很好,我不想用库更新来更新它。
(我知道我正在操作的函数将来可能会发生变化,但这也是一个与其他任何事情一样多的思想练习)
我正在寻找一种无需反编译类即可执行此操作的方法,即使用 AspectJ/Javassist/其他一些字节码操纵器
例如改变这个:
public class SlowWorker{
public static Foo getFoo(Bar b){
//do long running op using b and return a Foo
}
}
到:
public class SlowWorker{
private static LoadingCache<AdviceDocument, Object> fooCache = CacheBuilder
.newBuilder()
.maximumSize(10000)
.weakKeys()
.build(new CacheLoader<Bar, Object>() {
@Override
public Object load(Bar b) throws Exception {
return getUncachedFoo(b);
}
});
public static Foo getFoo(Bar b){
return fooCache.get(b);
}
public static Foo getUncachedFoo(Bar b){
Foo result = //long running op on b
return result;
}
}
最佳答案
经过几个小时的摆弄和研究,我意识到我正在尝试做的是热交换代码。
对于好奇的人:
关于java - 如何更改闭源类以操纵其中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33397278/