1

asm を使用してクラスに追加した静的フィールドを初期化したい。静的初期化子にアクセスできれば、初期化できます。

静的フィールドを初期化するにはどうすればよいですか?

4

2 に答える 2

4

ほとんどすべてをClassWriterに委任するClassAdapterを使用してフィールドを追加していると仮定しますが、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
    }
  }
}
于 2011-03-16T16:30:16.677 に答える
0

ClassVisitorvisitFieldでオーバーライドできるはずです

于 2010-11-09T18:20:10.453 に答える