javaagent (geschrieben mit Javassist) nicht richtig funktioniert

stimmen
0

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.

Veröffentlicht am 26/07/2017 um 14:39
vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
1

Es war ein Grundfehler. Während Klassenname von /, dh getrennt ist if (className.startsWith("a/b/"))das gleiche Format calssName verwendet wird, um die Klasse zu laden, die nicht korrekt ist.

Das Update ist CtClass ctClass = clPool.get(className.replaceAll("/","."));

Beantwortet am 26/07/2017 um 18:19
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more