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



我使用的是第三方库,在评测过程中发现了一个性能错误。我可以通过反编译有问题的类并将"getFoo(Barb)"方法更改为使用LoadingCache来轻松解决此问题。然后,我只需将该文件放在我自己的源代码中的同一个包中,它就会覆盖它。然而,该类的其余部分都很好,我不想让它随着库更新而更新。

(我知道我正在操作的功能在未来可能会发生变化,但这也是一次思考练习。)

我正在寻找一种不用反编译类就能做到这一点的方法,即使用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;
    }
}

经过几个小时的摸索和研究,我意识到我要做的是对代码进行热交换。

对于好奇者:

  • http://www.hotswapagent.org/
  • http://zeroturnaround.com/software/jrebel/

如果它是一个开源库,那么获取源代码,进行更新和编译,然后向社区提交您的更改。他们将决定是否将其添加到源代码树中以备将来发布。

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

最新更新