推荐的字节码操作库,用于重写类文件以更改类型e。 G。田地?

时间:2013-02-04 02:39:05

标签: java bytecode java-bytecode-asm bytecode-manipulation

我正在寻找一种从现有文件生成类文件的方法,同时允许我用另一种类型替换字段的类型。

考虑这个示例代码段,其中我想要int bar的所有用法......

class Foo {
  private final int bar;

  public Foo(int bar) {
    this.bar = bar;
  }

  public int getBar() {
    return bar;
  }

  public static int of(int bar) {
    return new Foo(bar);
  }
}

使用long bar,如下所示:

class Foo_Long {
  private final long bar;

  public Foo_Long(long bar) {
    this.bar = bar;
  }

  public long getBar() {
    return bar;
  }

  public static Foo_Long of(long bar) {
    return new Foo_Long (bar);
  }
}

我已经研究了多个字节码操作库,比如cglib,javassit和ASM,但它们似乎都专注于添加成员或用现有的不同方法替换一个方法体。

是否有一个提供类似......的库?

byte[] rewriteFieldWithType(Class klazz,
                            Field field,
                            Class type,
                            String newClassName) { ... }

Field field = Foo.class.getDeclaredField("bar");
byte[] newClass = rewriteFieldWithType(Foo.class,
                                       field,
                                       java.lang.Long.TYPE,
                                       "Foo_Long");

......以万无一失的方式?或者我是否需要实现所有丑陋的东西,如修复元数据和替换方法体中的不同字节码指令,例如: G。手动iload的{​​{1}}?

1 个答案:

答案 0 :(得分:1)

我不相信你会找到这种特定字节码转换的框架。由于您已经提到了ASM和其他字节码操作框架,因此它们都是通用框架并允许实现任何转换。

使用ASM,实际转换看起来比您预期的要简单得多,例如:您可以使用Type.getOpcode()获取新类型的指令操作码。

此外,要跟踪堆栈或本地变量中的值来源,您可以使用ASM SourceInterpreter中的analysis package