Question

Objectif

  • Détection où les comparaisons entre et des copies des variables sont faites
  • Injecter du code près de la ligne où l'opération s'est produite
  • Le but du code: chaque fois que la classe est exécutée, faites une augmentation

Objectif général: Comptez la quantité de comparaisons et copies faites après exécution avec certains paramètres

2 options

Remarque: j'ai toujours un fichier .java pour commencer

1) Modifier le fichier Java


Trouvez des comparaisons avec Regex et injectez des pièces de code près de la ligne, puis compilez la classe (mon application utilise Javacompiler)

2) Utiliser ASM Bytecode Engineering


Détectant également où les événements que je souhaite suivre et injecter des pièces dans le bytecode, puis utiliser la classe (déjà compilée mais modifiée)

Ma question

Quel est le moyen le meilleur / le plus propre? Y a-t-il une meilleure manière de faire cela?

Était-ce utile?

La solution

Si vous optez pour la route Java, vous ne voulez pas utiliser Regexes - vous voulez un véritable analyseur Java. Cela peut donc influencer votre décision. Mind, l'Oracle JVM en comprend un, dans le cadre de leurs classes privées internes qui implémentent le compilateur Java, vous n'avez donc pas à en écrire un vous-même si vous ne le souhaitez pas. Mais le décodage de l'Oracle AST n'est pas non plus une tâche de 5 minutes. Et, bien sûr, l'utilisation n'est pas portable si c'est important.

Si vous empruntez la route ASM, le bytecode sera initialement plus facile à analyser, car la sémantique est beaucoup plus simple. La question de savoir si la simplicité des analyses l'emporte sur la méconnaissance est inconnue en termes de temps net à votre solution. En fin de compte, en termes de code généré, ni l'un ni l'autre n'est "meilleur".

Il y a une simplicité apparente à regarder simplement le code source Java généré et à "savoir" que ce que vous voyez est ce que vous obtenez par rapport à des vidages primitifs de fichiers de classe pour le débogage et etc., mais toute cette simplicité apparemment est là à cause de votre déjà existant Comfortabilité avec le lanaguage Java. Une fois que vous passerez du temps à draguer dans le code d'octets qui aussi deviendra confortable. Juste une question de savoir si cela vaut le temps pour vous d'y arriver en premier lieu.

Autres conseils

Généralement, tout dépend à quel point vous êtes confortable avec l'une ou l'autre des options et à quel point l'aspect de performance est critique. La manipulation Bytecode sera beaucoup plus rapide et un peu plus simple, mais vous devrez comprendre comment fonctionne ByteCode et comment utiliser le framework ASM.

Intercepter l'accès variable est probablement l'un des cas d'utilisation les plus simples pour ASM. Vous pourriez trouver quelques scénarios plus complexes dans ce AOSD'07 papier.

Voici un code simplifié pour intercepter l'accès des variables:

ClassReader cr = ...;
ClassWriter cw = ...;
cr.accept(new MethodVisitor(cw) {
  public void visitVarInsn(int opcode, int var) {
    if(opcode == ALOAD) {  // loading Object var
      ... insert method call
    } 
  }
});

Si c'était moi, j'utiliserais probablement l'option ASM.

Si vous avez besoin d'un tutoriel sur ASM, je suis tombé sur ce tutoriel écrit par l'utilisateur Cliquez ici

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top