java - 如何更改闭源类以操纵其中的方法

标签 java bytecode

我正在使用第 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/

相关文章:

java - 在 Java 代理中重定位 AspectJ 包

java - 如何在 ByteBuddy 转换期间增加方法?

bytecode - 以太坊字节码 JUMP 和 JUMPDEST 是如何解决的?

java - 使用多个 getter 时使用 Try-Catch 而不是空检查

java - Java 中的三元运算符仅评估自 Java 7 以来的一个表达式 - 在 Java 1.6 及更低版本中是否有所不同?

java - 动态类重新加载仅在 Debug模式下有效,为什么/如何真正起作用?

java - JBoss 类中的 LocalVariableTable 已损坏

java - 您知道 Java 字节码解释器吗?

java - 热点JVM Bytecode Interpreter是跟踪JIT吗?

java - 获取下一个同名 Android 的 Jsoup 元素