asm を使用してクラスに追加した静的フィールドを初期化したい。静的初期化子にアクセスできれば、初期化できます。
静的フィールドを初期化するにはどうすればよいですか?
asm を使用してクラスに追加した静的フィールドを初期化したい。静的初期化子にアクセスできれば、初期化できます。
静的フィールドを初期化するにはどうすればよいですか?
ほとんどすべてを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
}
}
}
ClassVisitorvisitField
でオーバーライドできるはずです