1

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

如何初始化静态字段?

4

2 回答 2

4

我假设您通过使用将几乎所有内容委托给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
    }
  }
}
于 2011-03-16T16:30:16.677 回答
0

您应该能够visitFieldClassVisitor中覆盖

于 2010-11-09T18:20:10.453 回答