フィールドのタイプを別のタイプに置き換えながら、既存のクラス ファイルからクラス ファイルを生成する方法を探しています。
この例のスニペットを考えてみてください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");
...ばかげた方法で?または、メタデータを修正し、メソッド本体のさまざまなバイトコード命令iload
をlload
手動で置き換えるなど、すべての醜いものを実装する必要がありますか?