J'écris un agent java et en utilisant la bibliothèque javassist pour modifier le bytecode. J'ai une classe principale d'agent (MyAgent) et une classe de transformateur de fichier de classe. MyAgent.java enregistre la classe transformateur MyClzTransformer
javaagent (écrit en utilisant Javassist) ne fonctionne pas correctement
public class MyAgent
{
private static Instrumentation instrumentation;
public static void premain(String arg, Instrumentation inst)
{
inst.addTransformer(new MyClzTransformer());
}
}
-
public class MyClzTransformer implements ClassFileTransformer
{
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException
{
if (className.startsWith("a/b/"))
{
ClassPool clPool = ClassPool.getDefault();
System.out.println("clPool =======> " + clPool);
try
{
CtClass ctClass = clPool.get(className);
System.out.println("ct class: " + ctClass + ": methods = " + Arrays.deepToString(ctClass.getMethods()));
for(CtMethod method : ctClass.getMethods())
{
method.insertAfter("System.out.println(\" ============ added instrumented code ============ \");");
}
}
catch (NotFoundException | CannotCompileException | IOException e)
{
e.printStackTrace();
}
}
return classfileBuffer;
}
}
Quand je lance le pot myAgent comme javaagent comme suit:
java -javaagent:<path to myagent.jar> a.b.MyTestProgram
Je ne reçois pas de journaux (sysouts) sortie.
Est-ce un problème de classloader? Parce que le journal après clPool.get(className)
n'est pas en cours d'exécution. Je ne reçois aucune sortie de try block
.