前言
这篇主要来记录一下实现Instrumentation的方式–premain。premain是在 Java SE 5中新引入的 ,开发者只能在 premain 当中施展想象力,所作的 Instrumentation 也仅限与 main 函数执行前。
preMain编写
随便创建一个类,在类中定义premain的方法:
1 | public class IPreMain { |
这个方法的大体意思为:在执行虚拟机创建后,大多数的类都还没被加载进来,这个时候我们给Instrumentation添加了一个转换器,Instrumentation会在类被加载的过程中使用该转换器。
ITransformer 编写
这个转换器,因为在premain中被添加到了Instrumentation中,它在每个类被加载的时候对类文件会有一个转换的过程。
来看一下ITransformer
的实现:
1 | public class ITransformer implements ClassFileTransformer { |
Main 编写
1 | public class Main { |
pom.xml
需要把premain对应的类打成Jar包,这里通过maven来实现,不清楚如何打包可以百度一下。
1 | <build> |
项目结构和启动配置
在启动Main函数指定生成的jar:
1 | -javaagent:F:\agentTest\target\agentTest-1.0-SNAPSHOT.jar |
调用结果:
每个方法被加上了启动时间与结束时间