用ByteBuddy替换字节码中的类型出现次数

时间:2016-12-15 08:13:58

标签: java bytecode instrumentation bytecode-manipulation byte-buddy

ByteBuddy是否可以在字节码中替换某些类型的出现? E. g。如果我有一个班级

class MyClass {
    Foo makeFoo() {
       return new Foo(); 
    }
}

我想转换这个类的字节码,以便它等同于

class MyClass {
    Bar makeFoo() {
       return new Bar(); 
    }
}

我。即将所有Foo替换为Bar

1 个答案:

答案 0 :(得分:1)

正如霍尔格所说,这不属于Byte Buddy试图实现的范围。 Byte Buddy尝试为代码操作提供安全的环境,在您的情况下,需要验证BarFoo的有效替代。此外,它需要重新计算相当昂贵的堆栈映射帧。

如果您想使用Byte Buddy,它可以访问底层的ASM。 ASM提供Remapper,你可以用它来做这件事。如果您只想这样做,您应该考虑在没有Byte Buddy的情况下使用ASM。正如Holger在他的评论中提到的,最有效的方法是重写常量池条目,它是ASM不支持的Foo的根引用,所以你甚至可能想要找到另一种方式,即使是一个简单的ASM访问不会产生太多的开销。