Je souhaite initialiser un champ statique que j'ai ajouté à une classe en utilisant asm. Si je pouvais accéder à l'initialiseur statique alors je pourrais à l'initialisation.Initialiseur statique dans asm
Comment initialiser un champ statique?
Je souhaite initialiser un champ statique que j'ai ajouté à une classe en utilisant asm. Si je pouvais accéder à l'initialiseur statique alors je pourrais à l'initialisation.Initialiseur statique dans asm
Comment initialiser un champ statique?
Je suppose que vous ajoutez le champ à l'aide d'un ClassAdapter que les délégués presque tout à un ClassWriter mais demande également visitField d'ajouter les nouveaux champs.
Si les champs que vous ajoutez sont initialisés à des constantes. Ensuite, vous pouvez simplement fournir un littéral Object directement à ClassVisitor.visitField. Si les champs que vous ajoutez nécessitent une initialisation statique compliquée, vous devez remplacer ClassAdapter.visitMethod par la méthode <clinit>
et créer un MethodAdapter personnalisé qui ajoute le code souhaité. Un croquis approximatif du code est le suivant:
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
}
}
}
Vous devriez être en mesure de simplement remplacer visitField
dans ClassVisitor