我正在寻找一种从现有文件生成类文件的方法,同时允许我用另一种类型替换字段的类型。
考虑这个示例代码段,其中我想要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}}?
答案 0 :(得分:1)
我不相信你会找到这种特定字节码转换的框架。由于您已经提到了ASM和其他字节码操作框架,因此它们都是通用框架并允许实现任何转换。
使用ASM,实际转换看起来比您预期的要简单得多,例如:您可以使用Type.getOpcode()获取新类型的指令操作码。
此外,要跟踪堆栈或本地变量中的值来源,您可以使用ASM SourceInterpreter中的analysis package。