C'est la première fois que j'applique un agent java et j'essaie d'apprendre quelque chose sur l'instrumentation bytecode. Après avoir lu plusieurs introductions et tutoriels j'ai codé une petite application avec deux classes (été et application). Maintenant, je veux lancer un agent java via la méthode de premain pour montrer le chemin d'exécution en utilisant le code suivant:Problèmes avec l'agent Java pour l'instrumentation bytecode
public class TestJavaAgent {
public static void premain(String agentArgument,
Instrumentation instrumentation){
instrumentation.addTransformer(new ClassFileTransformer() {
@Override
public byte[] transform(ClassLoader classLoader, String s, Class<?> aClass, ProtectionDomain protectionDomain, byte[] bytes) throws IllegalClassFormatException {
ClassPool cp = ClassPool.getDefault();
try {
CtClass cc = cp.get("Summer");
CtMethod methods [] = cc.getMethods();
for(CtMethod method : methods){
System.out.println("Entering "+method.getName());
method.addLocalVariable("elapsedTime", CtClass.longType);
method.insertBefore("elapsedTime = System.currentTimeMillis();");
method.insertAfter("{elapsedTime = System.currentTimeMillis() - elapsedTime;"
+ "System.out.println(\"Method Executed in ms: \" + elapsedTime);}");
}
return cc.toBytecode();
} catch (Exception ex) {
return bytes;
}
}
});
}
}
j'ai commencé à l'agent via java -javaagent{Agent JAR} -jar {Application Jar}
mais il n'a rien imprimer des messages insérés. Après avoir débogué le code j'ai réalisé tout après "ClassPool.getDefault()" ne sera pas atteint mais je ne sais pas pourquoi. Est-ce que quelqu'un peut m'aider?