En étudiant le fonctionnement de KODO en standalone, j’ai été amené à utiliser un concept qui m’était inconnu : les JavaAgents. C'est une nouveauté de Java 5 pour laquelle on trouve très peu de documentation. Je vous propose donc d'expliquer simplement son utilisation.
DéfinitionUn JavaAgent est une librairie « pluggable » qui tourne dans une JVM embarqué (celle du programme exécuté) et qui intercepte les chargements de classes. Cela permet donc de suivre le processus de chargement des classes d’un programme java et, si nécessaire, de modifier à chaud le comportement de la classe (mécanisme d’intercession).
Concrètement un JavaAgent se présente sous la forme d’un simple JAR contenant une classe implémentant une méthode :
public static void premain(String agentArgs, Instrumentation inst)
Le premier argument de cette méthode est un String représentant les arguments à passer à l’agent (à parser sois même avec pipe, délimiteur,…). Le deuxième est l’instance d’Instrumentalisation. C’est grâce à cette classe que l’on ajoute les transformers voulus.
ClassTransformer
Les classes implémentant l’interface ClassFileTransformer sont créées pour effectuer des modifications dans le bytecode de classes existantes. Leur implémentation est très simple puisqu’il suffit d’implémenter l’unique méthode de l’interface ClassFileTransformer.
Création d’un agent java simple
package fr.demo.testAgent;
import java.lang.instrument.Instrumentation;
import fr.demo.testTransformer.TestClassTransformer;
public class myJavaAgent {
public static void premain(String agentArgs, Instrumentation inst)
{
inst.addTransformer(new TestClassTransformer());
}
}
La seule opération de l’agent est d’ajouter un classtransformer à l’instance d’instrumentalisation de
Code du class transformer :
package fr.demo.testAgent;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;
public class EzClassTransformer implements ClassFileTransformer {
Class classBeingRedefined, ProtectionDomain protectionDomain,
byte[] classfileBuffer) throws IllegalClassFormatException {
System.out.println("Je charge la classe :" + className);
return classfileBuffer;
}
}
Création du JAR
Premain-Class: fr.demo.testAgent.myJavaAgent
Cette entrée permet de définir à
-javaagent:lienversjar .
Conclusion
Les AgentsJava sont très utiles pour ajouter des crochets au chargement des classes de
Aucun commentaire:
Enregistrer un commentaire