2013-01-14 3 views
0

Here est une référence à propos de l'instruction INVOKESPECIAL bytecode. Si j'ai un AbstractInsnNode de l'infrastructure ASM contenant l'instruction INVOKESPECIAL, mon nœud inclura-t-il la spécification de la méthode de l'instruction? Par exemple, avec un code comme ceci:bytecode et ASM

String ins = insn.toString; 

Si le insn avait une instruction invokespecial, mes ins aurait une chaîne comme "invokespecial java/lang/StringBuffer /() V"? Ce que je veux faire est obtenir la spécification de la méthode d'une instruction INVOKESPECIAL et le stocker dans une chaîne afin que mon programme puisse le lire.

Répondre

0

Voulez-vous lire la classe lors de l'exécution? essayez cette

import org.objectweb.asm.ClassReader; 
    import org.objectweb.asm.util.ASMifierClassVisitor; 


    ClassReader cr = new ClassReader(b); 
    cr.accept(new ASMifierClassVisitor(new PrintWriter(System.out)), 0); 
0

Si j'ai un AbstractInsnNode du cadre ASM contenant l'instruction invokespecial, sera mon noeud comprend la spécification de la méthode de l'instruction?

AFAIK, oui. Il doit s'agir d'une instance de MethodInsnNode et le champ desc doit être une chaîne de descripteur de méthode.

Si l'insn avait une instruction INVOKESPECIAL, mon ins aurait une chaîne comme "invokespecial java/lang/StringBuffer /() V"?

Actuellement, il existe trois composants. La chaîne de descripteur de méthode, le nom de méthode et le nom interne de la classe qui possède la méthode (dans ce cas, réelle).

+0

donc si je convertis une variable methodinsnnode en chaîne, je serai capable d'utiliser une méthode comme .contains ("lang") pour trouver le mot "lang" dans le descripteur? – user1912475

+0

Cela ressemble à une mauvaise idée. Vous devriez être capable de transformer l'objet en 'MethodInsnNode', puis accéder aux informations via les champs déclarés. Il est un peu difficile de savoir quelles informations vous avez réellement après, mais il ressemble à * vous voulez le nom du type qui déclare la méthode plutôt que la signature de la méthode. (Malheureusement, il y a des aspects de votre Question qui n'ont aucun sens.) –

+0

Laissez-moi essayer d'expliquer: Je veux juste stocker dans une chaîne le descripteur (où est le nom de la superclasse invoquée par l'instruction invokespecial) afin que mon programme puisse finalement lire cette chaîne et savoir si la méthode a été appelée pour gérer une exception – user1912475