如何更改闭源 class 以操纵其中的方法
How can I change a closed-source class to manipulate the methods within
我正在使用第 3 方库,并且在分析过程中发现了其中的性能错误。我可以通过反编译有问题的 class 并将 'getFoo(Bar b)' 方法更改为使用 LoadingCache 来轻松解决此问题。然后我将该文件放在我自己的源代码中的同一个包中,它会覆盖它。但是,class 的其余部分很好,我不想用库更新来更新它。
(我知道我正在操作的函数将来可能会发生变化,但这也是一个与其他任何事情一样多的思想练习)
我正在寻找一种无需反编译 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;
}
}
如果它是开源库,则获取源代码、进行更新和编译,然后为社区提交更改。他们将决定是否将其添加到源代码树中以供将来发布。
如果是闭源,联系厂商试试,大部分闭源许可禁止反编译。联系供应商可能会让他们为你更新他们的图书馆,并帮助你在公司建立联系。
经过几个小时的摆弄和研究,我意识到我想做的是热交换代码。
好奇者:
我正在使用第 3 方库,并且在分析过程中发现了其中的性能错误。我可以通过反编译有问题的 class 并将 'getFoo(Bar b)' 方法更改为使用 LoadingCache 来轻松解决此问题。然后我将该文件放在我自己的源代码中的同一个包中,它会覆盖它。但是,class 的其余部分很好,我不想用库更新来更新它。
(我知道我正在操作的函数将来可能会发生变化,但这也是一个与其他任何事情一样多的思想练习)
我正在寻找一种无需反编译 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;
}
}
如果它是开源库,则获取源代码、进行更新和编译,然后为社区提交更改。他们将决定是否将其添加到源代码树中以供将来发布。
如果是闭源,联系厂商试试,大部分闭源许可禁止反编译。联系供应商可能会让他们为你更新他们的图书馆,并帮助你在公司建立联系。
经过几个小时的摆弄和研究,我意识到我想做的是热交换代码。
好奇者: