如何更改闭源类来操作其中的方法

时间:2015-10-28 17:08:28

标签: java bytecode

我正在使用第三方库,并在分析期间发现了性能错误。我可以通过反编译违规类并更改'getFoo(Bar b)'方法来使用LoadingCache来轻松解决这个问题。然后我将该文件放在我自己的源中的同一个包中,它会覆盖它。但是,该类的其余部分很好,我不想让它更新库更新。

(我知道我正在操作的功能可能会在未来发生变化,但这也是一个与其他事情一样的思考练习)

我正在寻找的是一种在不反编译类的情况下执行此操作的方法,即使用AspectJ / Javassist /其他字节码操纵器

e.g。改变这个:

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;
    }
}

2 个答案:

答案 0 :(得分:2)

经过几个小时的摆弄和研究,我意识到我试图做的是热插拔代码。

对于好奇:

答案 1 :(得分:1)

如果它是一个开源库,那么获取源代码,进行更新并编译,然后为社区提交更改。他们将决定是否将其添加到源树以供将来版本使用。

如果是封闭源,请尝试联系供应商,大多数封闭源许可证禁止反编译。联系供应商可能会让他们为您更新他们的库,并帮助您在公司建立联系。