当使用javassist来检测com.sun.net.*类时,我可以成功使用.insertAfter方法。
但是,当尝试从Glassfish中运行的应用程序检测第三方类时,出现错误:


检测失败
com.app.class

agent.internal.javassist.CannotCompileException:无法
找到org.springframework.class


如此看来,javaagent能够提取该类的字节码,但无法对其进行编译,因为找不到所检测的方法(来自org.springframework)的某些依赖项。

最佳答案

这是不寻常的行为,因为人们希望javassist可以将字节码简单地附加到检测方法上,而不必引用在同一方法中引用的任何类。

我可以通过检查代理使用的ClassPool来调试问题:

ClassPool pool = new ClassPool();
pool.appendSystemPath();
CustomLogger.logText("Class pool: " + pool.toString());


导致:


类池:[类路径:
my.java.agent.Transformer.class:java.lang.Object.class:]


然后,我们可以将丢失的库* .jar的确切路径(在运行代理的机器上!)插入到classPool中:

pool.insertClassPath("/path/to/glassfish/modules/missing-module.jar");


结果是:


类池:[类路径:
文件:/path/to/glassfish/modules/missing-module.jar:my.java.agent.Transformer.class:java.lang.Object.class:]


javassist现在可以编译该类

10-04 13:40
查看更多