ByteBuddy是否可以在字节码中替换某些类型的出现? E. g。如果我有一个班级
class MyClass {
Foo makeFoo() {
return new Foo();
}
}
我想转换这个类的字节码,以便它等同于
class MyClass {
Bar makeFoo() {
return new Bar();
}
}
我。即将所有Foo
替换为Bar
。
答案 0 :(得分:1)
正如霍尔格所说,这不属于Byte Buddy试图实现的范围。 Byte Buddy尝试为代码操作提供安全的环境,在您的情况下,需要验证Bar
是Foo
的有效替代。此外,它需要重新计算相当昂贵的堆栈映射帧。
如果您想使用Byte Buddy,它可以访问底层的ASM。 ASM提供Remapper
,你可以用它来做这件事。如果您只想这样做,您应该考虑在没有Byte Buddy的情况下使用ASM。正如Holger在他的评论中提到的,最有效的方法是重写常量池条目,它是ASM不支持的Foo
的根引用,所以你甚至可能想要找到另一种方式,即使是一个简单的ASM访问不会产生太多的开销。