Java Agent入门实战(二)-Instrumentation源码概述

Instrumentation接口设计初衷是为了收集Java程序运行时的数据,用于监控运行程序状态,记录日志,分析代码用的。接下来从源码的流程来介绍一下

 

 

 

实现类InstrumentationImpl的void addTransformer(ClassFileTransformer transformer, boolean canRetransform);

 

 

 

从这段代码知道,转换器ClassFileTransformer的实现是存储在TransformerManager的TransformerInfo数组中的,数组初始长度为0,每添加一个,数组长度为原来的长度+1,将原数组内容拷贝到新数组中。

 

 

 

VirtualMachine.attach

 

 

 

进入AttachProvider.providers(),这里面会初始化AttachProvider,并返回一个AttachProvider List

 

 

 

进入ServiceLoader.load(AttachProvider.class, AttachProvider.class.getClassLoader());

 

 

 

 

继续跟进方法 new LazyIterator(service, loader)

 

 

看一下com.sun.tools jar包下的META-INF/services/目录,打开 com.sun.tools.attach.spi.AttachProvider, 可以看到有不同平台操作系统的实现,我的是windows,会调用windos的实现sun.tools.attach.WindowsAttachProvider。其他的都被注释掉了。代码看到这,就知道ServiceLoader.load方法最终加载的是sun.tools.attach.WindowsAttachProvider

 

 

 

 

 

 

上文hasNextService()方法下面的nextService()

 

 

 

回到最初的VirtualMachine.attach(String var0)方法,进入return var4.attachVirtualMachine(var0);attachVirtualMachine()

 

 

 

 

 

通过 ClassLoader 类中的findNative方法,可以找到JVM源码中的一些native方法调用名,这样可以关联着JVM源码看底层的C++源码到底做了啥

 

 

 

发现在attach.dll中找方法名为Java_sun_tools_attach_WindowsVirtualMachine_openProcessnative method

 

 

 

尝试性的在jdk源码里去找这2个方法Java_sun_tools_attach_WindowsVirtualMachine_openProcessJava_sun_tools_attach_WindowsVirtualMachine_enqueue

 

 

 

 

virtualMachine.loadAgent()、 virtualMachine.detach()源码流程和上述类似,也和平台相关,这里就不在赘述了。

RedefineClasse配置注意事项

可以在运行期对已加载类的字节码做变更,但是这种情况下会有很多的限制 对比新老类,并要求如下:

  • 父类是同一个
  • 实现的接口数也要相同,并且是相同的接口
  • 类访问符必须一致
  • 字段数和字段名要一致
  • 新增的方法必须是 private static/final 的
  • 可以删除修改方法
全部评论

相关推荐

不愿透露姓名的神秘牛友
10-15 14:22
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
440577次浏览 4493人参与
# 春招别灰心,我们一人来一句鼓励 #
41503次浏览 524人参与
# 北方华创开奖 #
107312次浏览 599人参与
# 地方国企笔面经互助 #
7928次浏览 18人参与
# 同bg的你秋招战况如何? #
75577次浏览 552人参与
# 虾皮求职进展汇总 #
114215次浏览 884人参与
# 阿里云管培生offer #
119867次浏览 2219人参与
# 实习,投递多份简历没人回复怎么办 #
2454001次浏览 34848人参与
# 实习必须要去大厂吗? #
55678次浏览 960人参与
# 提前批简历挂麻了怎么办 #
149825次浏览 1977人参与
# 投递实习岗位前的准备 #
1195731次浏览 18546人参与
# 你投递的公司有几家约面了? #
33180次浏览 188人参与
# 双非本科求职如何逆袭 #
661910次浏览 7394人参与
# 如果公司给你放一天假,你会怎么度过? #
4730次浏览 55人参与
# 机械人春招想让哪家公司来捞你? #
157604次浏览 2267人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11365次浏览 270人参与
# 发工资后,你做的第一件事是什么 #
12418次浏览 61人参与
# 工作中,努力重要还是选择重要? #
35612次浏览 384人参与
# 参加完秋招的机械人,还参加春招吗? #
20091次浏览 240人参与
# 我的上岸简历长这样 #
451924次浏览 8088人参与
# 实习想申请秋招offer,能不能argue薪资 #
39235次浏览 314人参与
# 非技术岗是怎么找实习的 #
155850次浏览 2120人参与
牛客网
牛客企业服务