asm中的静态初始化程序

时间:2010-11-09 14:56:10

标签: java bytecode java-bytecode-asm

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

如何初始化静态字段?

2 个答案:

答案 0 :(得分:3)

我假设您使用ClassAdapter添加该字段,该ClassWriter几乎将所有内容委托给visitField,但也会调用ClassVisitor.visitField来添加新字段。

如果要添加的字段初始化为常量。然后,您只需将对象文字直接提供给ClassAdapter.visitMethod

如果要添加的字段需要复杂的静态初始化,则需要覆盖MethodAdapter检查<clinit>方法并创建添加所需代码的自定义{{3}}。代码的草图如下:

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
    }
  }
}

答案 1 :(得分:0)

您应该可以在ClassVisitor

中覆盖visitField