当使用javassist测试com.sun.net.*
类时,我可以成功地使用.insertAfter方法。然而,当试图从运行在Glassfish中的应用程序中检测第三方类时,我得到了一个错误:
测试com.app.class失败
agent.internal.javassist.CannotCompileException:找不到org.springframework.class
因此,javaagent似乎能够获取类的字节码,但无法编译它,因为无法找到(从org.springframework
)被检测的方法的一些依赖项。
发布于 2020-05-19 08:50:44
这是一种不寻常的行为,正如人们所期望的那样,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");
其结果是:
类池:类路径: file:/path/to/glassfish/modules/missing-module.jar:my.java.agent.Transformer.class:java.lang.Object.class:
现在可以编译类了。
https://stackoverflow.com/questions/61896496
复制