2017-07-26 7 views
0

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 MyClzTransformerjavaagent (é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.

Répondre

1

Il y a eu une erreur de base. Alors que le nom de classe est séparé par /, c'est-à-dire if (className.startsWith("a/b/")), le même format calssName est utilisé pour charger la classe, ce qui n'est pas correct. La correction est