2010-11-13 2 views
4

Contexte: Dans mon projet Java, je suis en train d'injecter une classe (par exemple Injected.java) et aussi du byte-code en injectant une référence à une méthode dans Injected.java, de sorte que cette méthode définit la valeur d'une instance membre. C'est une façon de vérifier que je suis un octet de code qui injecte la bonne chose. Lors de l'exécution, la valeur de la variable d'instance n'est pas définie comme prévu, ce qui signifie que mon injection de code octet n'a évidemment pas bien fonctionné.comment déboguer le code octet injecté dans la machine virtuelle au moment du chargement de la classe?

Question: 1) Comment examiner le contenu de ma classe (nouvellement injectée + modifiée) chargée dans la JVM au moment de l'exécution? (javap aide à faire cela pour les classes existantes) 2) Puis-je déboguer via Eclipse, le code d'injection de code octet? Y at-il un plug-in

Toute suggestion est appréciée.

Répondre

1

Vous pouvez utiliser javaassist

Partons étape par étape:

  1. Obtenir le contenu du fichier de classe (par exemple, Point.class), que vous souhaitez modifier par injection de bytecode ClassFile fournit addField() et addMethod() pour ajouter un champ ou une méthode (notez qu'un constructeur est considéré comme am ethod au niveau du bytecode). Il fournit également addAttribute() pour ajouter un attribut au fichier de classe.

    Notez que les objets FieldInfo, MethodInfo et AttributeInfo incluent un lien vers un objet ConstPool (table de pool constant). L'objet ConstPool doit être commun à l'objet ClassFile et à un objet FieldInfo (ou MethodInfo etc.) ajouté à cet objet ClassFile. En d'autres termes, un objet FieldInfo (ou MethodInfo etc.) ne doit pas être partagé entre différents objets ClassFile.

    Pour supprimer un champ ou une méthode d'un objet ClassFile, vous devez d'abord obtenir un objet java.util.List contenant tous les champs de la classe. getFields() et getMethods() renvoient les listes. Un champ ou une méthode peut être supprimé en appelant remove() sur l'objet List. Un attribut peut être supprimé de la même manière. Appelez getAttributes() dans FieldInfo ou MethodInfo pour obtenir la liste des attributs et supprimez-en un dans la liste.

  2. Maintenant, vérifiez, si l'injection a vraiment fonctionné:

    MethodInfo minfo = cf.getMethod("move"); // we assume move is not overloaded.

    CodeAttribute ca = minfo.getCodeAttribute();

    il y a un certain nombre de méthodes MethodInfo/CodeAttribute pour vérifier

Si vous l'aimez, s'il vous plaît faites le moi savoir. Ce cas, je mis un blog plus détaillé http://puspendu.wordpress.com/

Ref: here

+0

Cela ne traite pas le cas d'utilisation de l'OP, ou de répondre à l'une de ses questions. Il veut examiner les bytecodes qu'il a injectés au moment de l'exécution, et non les codes qui ont été injectés dans les classfiles avant l'exécution.(Et comme il le dit, 'javap' le fait de toute façon.) –

+0

BTW - il est impoli de downvote quelqu'un d'autre répond. Et faire cela sur la base de l'inutilité lorsque votre réponse est encore moins pertinente est assez boiteux, OMI. –

+0

Malheureusement, j'ai appris à voter en bas de stack-overflow. voir ce http://stackoverflow.com/questions/3868878/java-check-if-command-line-arguments-are-null. BTW, si vous voulez vous lever, éditer la réponse, je vais up-voter :) –

Questions connexes