Disons que je classe comme ceci:Quand VisitMethod d'un ClassVisitor sera appelé dans asm?
public class ClassPrinter extends ClassVisitor {
public ClassPrinter(ClassWriter writer) {
super(Opcodes.ASM5, writer);
}
@Override
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
super.visit(version, access, name, signature, superName, interfaces);
}
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
// when this line will get executed?
System.out.println(name);
}
}
maintenant quand le visitMethod
sera appelé? Est-ce quand le chargement de classes se passe en Java (c'est-à-dire quand le visiteur de classe est appelé?) Ou quand une méthode est appelée sur l'objet de classe?
Je suis confus à ce sujet.
Merci Animony. J'ai encore quelques questions, disons que j'utilise le code ci-dessus pour construire un agent java et le charger au démarrage de mon application. Puis, lors de l'exécution de mon application, tous les noms de méthode seront-ils imprimés via visitMethod? Par exemple, disons que dans mon application il y a un appel de méthode 'a.test()' alors j'obtiendrai la méthode de test et ses appels de méthode correspondants seront-ils tracés? –
@ Ant's: ** Non **, ce visiteur est pour le traitement d'une * classe *, pas pour tracer une * exécution *. Lorsque vous voulez vraiment entrer dans un tel sujet comme la manipulation du code octet, vous devriez arrêter de baser votre programmation sur des devinettes. Commencez à lire la documentation où l'objectif de la bibliothèque est expliqué, avant même de regarder l'API ... – Holger