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

标签 java instrumentation javassist javaagents

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

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 jar 作为 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("/","."));

关于javaagent(使用 Javassist 编写)无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45331605/

相关文章:

java - 如何使用 Javassist 制作 ArrayList

java - javassist 的 Weblogic 类加载问题

java - 目录轮询的最佳实践

java - maven循环引用错误

java - 如何在 Processing 中点对点画线

java - 能够使用 jackson 循环从 json 响应返回的每个用户

java - Java什么时候读取方法字节码?

java - 检测代码后出现 NoClassDefFoundError

java - 使用 javassist 修改在类构造函数中使用 getter 和 setter 的字段

java - 使用 Javassist 编译 hello world 类时出现问题