Instrumentation接口设计初衷是为了收集Java程序运行时的数据,用于监控运行程序状态,记录日志,分析代码用的。接下来从源码的流程来介绍一下java
实现类InstrumentationImpl的void addTransformer(ClassFileTransformer transformer, boolean canRetransform);
编程
从这段代码知道,转换器ClassFileTransformer的实现是存储在TransformerManager的TransformerInfo数组中的,数组初始长度为0,每添加一个,数组长度为原来的长度+1,将原数组内容拷贝到新数组中。windows
进入AttachProvider.providers()
,这里面会初始化AttachProvider
,并返回一个AttachProvider List
。数组
进入ServiceLoader.load(AttachProvider.class, AttachProvider.class.getClassLoader());
微信
继续跟进方法 new LazyIterator(service, loader)
ide
看一下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()
spa
回到最初的VirtualMachine.attach(String var0)
方法,进入return var4.attachVirtualMachine(var0);
的attachVirtualMachine()
内操作系统
经过 ClassLoader 类中的findNative
方法,能够找到JVM源码中的一些native方法调用名,这样能够关联着JVM源码看底层的C++源码到底作了啥设计
发如今attach.dll中找方法名为Java_sun_tools_attach_WindowsVirtualMachine_openProcess
native method
尝试性的在jdk源码里去找这2个方法Java_sun_tools_attach_WindowsVirtualMachine_openProcess
和Java_sun_tools_attach_WindowsVirtualMachine_enqueue
virtualMachine.loadAgent()、 virtualMachine.detach()
源码流程和上述相似,也和平台相关,这里就不在赘述了。
能够在运行期对已加载类的字节码作变动,可是这种状况下会有不少的限制 对比新老类,并要求以下:
参考
文章每周持续更新,能够微信搜索「 十分钟学编程 」第一时间阅读和催更,若是这个文章写得还不错,以为有点东西的话 ~求点赞👍 求关注❤️ 求分享❤️
各位的支持和承认,就是我创做的最大动力,咱们下篇文章见!