Ich schreibe einen Java-Agenten und mit Javassist Bibliothek zur Modifizierung von Bytecode. Ich habe einen Agenten Hauptklasse (MyAgent) und eine Datei Transformator Klasse Klasse. MyAgent.java registriert die Transformator-KlasseMyClzTransformer
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;
}
}
Wenn ich laufe das MyAgent Glas als javaagent, wie folgend:
java -javaagent:<path to myagent.jar> a.b.MyTestProgram
Ich habe nicht alle Protokolle (sysouts) ausgegeben.
Ist es ein Problem Classloader? Denn nachdem das Protokoll clPool.get(className)
nicht ausgeführt wird. Ich erhalte keine Ausgabe von innen try block
.