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