离开学校来广州上班已经3年+了,还记得才进公司的愣头青样子,思维还停留在学校,不懂得一份工作所意味着的责任。大条的我搞出了很多问题,都是老人帮忙擦屁股(嘿嘿嘿)。加班很多,也经常通宵,很累但仗着精力旺盛,熬过来然后习惯了知道现在。
回到正题
熟悉了业务后,工作变得重复,多出的时间便找项目里各个角落的代码来看。其中一个比较有意思的工具便是今天的主题——热替换工具。
工具主要涉及到3个java点:agent、attach api、instrumentation,我们一一道来。
(1)java agent
简单说,java程序的入口为main函数,而agent可以在main函数执行先执行一段代码,函数名叫premain或者agentmain。示例代码很简单,如下:
首先,新建agent类,定义一个简单的premain函数
import java.lang.instrument.Instrumentation;
public class HelloAgent {
public static void premain(String agentArgument, Instrumentation instrumentation){
System.out.println("hello agent");
}
}
然后,把这个agent类打成jar包,这里我们保存为helloagent.jar,jar包的MANIFEST.MF文件如下:
Manifest-Version: 1.0
Premain-Class: hotreplace.helloagent.HelloAgent
最后,写个最简单的helloworld程序如下
public class TestHelloAgent {
public static void main(String[] args){
System.out.println("hello world");
}
}
加启动参数
-javaagent:helloagent.jar
点击运行
hello agent
hello world
(2)attach api
我们先试想一下,如果要实现上面的helloagent,需要在启动main函数之前,就配好对应agent的启动参数,这样问题来了,假如我要实现如“热替换”的操作,我怎么能在java程序启动前知道要替换的class文件。(因为问题总是临时的,线上运行着的服务器一个功能突然出现问题,对应的class文件需要替换)
于是,attach技术便为了实现这个需求出现了
同样的,我们需要建1个agent类,不过上面的premain函数要改为agentmain
import java.lang.instrument.Instrumentation;
public class HelloAttach {
public static void