2010-11-09 28 views
1

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?

Répondre

3

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 
    } 
    } 
} 
0

Vous devriez être en mesure de simplement remplacer visitField dans ClassVisitor