2010-11-09 47 views
1

我想初始化一个使用asm添加到类中的静态字段。如果我可以访问静态初始化器,那么我可以进行初始化。asm中的静态初始化程序

如何初始化静态字段?

回答

3

我假设你正在使用ClassAdapter各位代表几乎所有的ClassWriter也可来电visitField添加新字段添加字段。

如果将要添加的字段初始化为常量。然后,您可以直接将对象文字提供给ClassVisitor.visitField

如果要添加的字段需要复杂的静态初始化,那么您需要覆盖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 
    } 
    } 
}