javaagent(使用Javassist编写)无法正常工作

问题描述:

我正在编写java代理并使用javassist库来修改字节码。 我有一个代理主类(MyAgent)和一个类文件转换器类。 MyAgent.java注册变压器类MyClzTransformerjavaagent(使用Javassist编写)无法正常工作

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; 
    } 
} 

当我运行MyAgent水瓶中javaagent如下:

java -javaagent:<path to myagent.jar> a.b.MyTestProgram 

我没有得到任何日志(sysouts )输出。

这是一个类加载器的问题?因为,clPool.get(className)之后的日志未执行。我没有从try block获得任何输出。

有一个基本的错误。虽然类名由/分隔,即if (className.startsWith("a/b/"))使用相同格式calssName正在使用 加载类,这是不正确的。

修复程序为CtClass ctClass = clPool.get(className.replaceAll("/","."));