【问题标题】:Replace type occurrences in bytecode with ByteBuddy用 ByteBuddy 替换字节码中出现的类型
【发布时间】:2016-12-15 08:13:57
【问题描述】:

ByteBuddy 是否可以替换字节码中某种类型的出现?例如。如果我有课

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

我想把这个类的字节码转换成等价于

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

我。 e.将所有出现的Foo 替换为Bar

【问题讨论】:

  • ByteBuddy 选择 ASM 并为某些用例提供更简单的接口,但我认为,替换类型的出现不在这些用例中。我什至认为 ASM 不是此类任务的最佳选择,因为您可以通过仅处理类的常量池(ASM 不直接支持的唯一操作)轻松有效地替换所有事件。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 2011-02-07
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多