Java agent 入门遇到点问题

339 天前
 moxiaowei

有一个普通的 springboot 项目,我想对项目中的方法执行时间进行计算。然后用 maven 搭了个 agent ,但是使用 java -javaagent 把探针加进去的时候,提示在探针中找不到对应的类。探针的代码,很简单,就是这样的:

ClassPool classPool = new ClassPool(true);
classPool.insertClassPath(new LoaderClassPath(LoadTimeAgent.class.getClassLoader()));
String targentClassName = "com.example.utils.BitStringUtil";
//根据类名获取到要修改的 class
CtClass targetClass = classPool.get(targentClassName);

......下面的代码省略了......

想想确实,agent 里面没有 com.example.utils.BitStringUtil 这样的类,然后我查了资料,说是 springboot 项目,java -javaagent:agent.jar -jar app.jar 的时候,探针中的 class 文件是被 AppClassLoader 加载的,而 springboot 中的 class 文件是被 LunchedURLClassLoader 加载的,而 LunchedURLClassLoader 是 AppClassLoader 的子类,子类( LunchedURLClassLoader )是无法被父类( AppClassLoader )看到的,所以在探针中是无法获取到 springboot 中的类的,那么有没有什么方法能处理?我想,别的探针项目,比如 sw 也不至于获取不到吧?

2139 次点击
所在节点    Java
11 条回复
dk7952638
339 天前
有可能是 agent 打包的时候没有把依赖打包进去,可以是看看 shadowjar 那种 fatjar 的打包模式
langmanxiaoa
339 天前
熟悉的 javassist 代码
cppc
339 天前
技术分享:How To Write a JavaAgent (袁伟)

<amp-youtube data-videoid="ujhqct2POLU" layout="responsive" width="480" height="270"></amp-youtube>&t=4s
jiakme
339 天前
探针的原理不是去 classload 中捞取已加载的类, 而是在 classload 加载类文件之前, 动态注入增强信息. 建议再看看 agent 的原理.
senninha
339 天前
SpringBoot jar in jar 打包方式是这样的。
你可以直接在探针里拿到 Instrumentation 对象,用 Instrumentation#getAllLoadedClasses 获取所有虚拟机加载的类,直接过滤出需要的,或者从以上加载的类中遍历拿到 springboot 的加载器也行。
senninha
339 天前
@jiakme 看 op 的需求,更像是直接注册一个 Transformer 拦截增强就行。
moxiaowei
339 天前
@senninha 是的
moxiaowei
339 天前
感谢各位,目前已经搞定了,就是在探针中手动加载了 LaunchedURLClassLoader ,然后修改了它的初始化方法,手动把需要加载的类加载进去,就可以了。
crossoverJie
339 天前
有一个简单方法,直接使用 skywalking 的 agent ,然后写 skywalking 的插件,删除不需要的,API 相对要好理解一些。
moxiaowei
339 天前
@crossoverJie 是入门 agent ,肯定要自己动手去写的,直接使用 sw 是不是有点太快了
MartinDai
338 天前
https://github.com/MartinDai/my-attach 给你个我自己写的入门 demo 做参考

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/943064

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX