Статический инициализатор в asm - PullRequest
1 голос
/ 09 ноября 2010

Я хочу инициализировать статическое поле, которое я добавил в класс, используя asm. Если бы я мог получить доступ к статическому инициализатору, то я мог бы к инициализации.

Как я могу инициализировать статическое поле?

Ответы [ 2 ]

3 голосов
/ 16 марта 2011

Я предполагаю, что вы добавляете поле, используя 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
    }
  }
}
0 голосов
/ 09 ноября 2010

Вы можете просто переопределить visitField в ClassVisitor

...