2

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

考虑这个示例片段,我想在其中每次使用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");

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

4

1 回答 1

1

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

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

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

于 2013-02-04T04:02:51.553 回答