我想初始化一个使用 asm 添加到类中的静态字段。如果我可以访问静态初始化程序,那么我可以进行初始化。
如何初始化静态字段?
我假设您通过使用将几乎所有内容委托给ClassWriter的ClassAdapter添加字段,但也调用visitField来添加新字段。
如果您要添加的字段被初始化为常量。然后,您可以简单地直接向ClassVisitor.visitField提供 Object 文字。
如果您要添加的字段需要复杂的静态初始化,那么您需要重写ClassAdapter.visitMethod检查该<clinit>
方法并创建一个自定义MethodAdapter来添加您想要的代码。代码的粗略草图如下:
class MyAdapter extends ClassAdapter {
public MyAdapter(ClassVisitor delegate) {
super(delegate);
}
@Override
public MethodVisitor visitMethod(int access, String name,
String desc, String signature, String[] exceptions) {
MethodVisitor r = super.visitMethod(access, name, desc, signature, exceptions);
if ("<clinit>".equals(name)) {
r = new MyMethodAdapter(r);
}
return r;
}
class MyMethodAdapter extends MethodAdapter {
MyMethodAdapter(MethodVisitor delegate) {
super(delegate);
}
@Override
public void visitCode() {
super.visitCode();
// build my static initializer by calling
// visitFieldInsn(int opcode, String owner, String name, String desc)
// or the like
}
}
}
您应该能够visitField
在ClassVisitor中覆盖