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 などの複数のバイトコード操作ライブラリを調べましたが、それらはすべて、メンバーの追加または 1 つのメソッド本体と既存の別のメソッド本体の置き換えに重点を置いているようです。

次のようなものを提供するライブラリはありますか...

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");

...ばかげた方法で?または、メタデータを修正し、メソッド本体のさまざまなバイトコード命令iloadlload手動で置き換えるなど、すべての醜いものを実装する必要がありますか?

4

1 に答える 1

1

このような特定のバイトコード変換のフレームワークが見つかるとは思えません。ASM やその他のバイトコード操作フレームワークについて言及したので、それらはすべて汎用フレームワークであり、あらゆる変換を実装できます。

ASM を使用すると、実際の変換は予想よりもはるかに簡単に見えます。たとえば、Type.getOpcode()を使用して、新しい型の命令オペコードを取得できます。

また、スタックまたはローカル変数の値のソースを追跡するには、ASM の分析パッケージからSourceInterpreterを使用できます。

于 2013-02-04T04:02:51.553 に答える