Java热替换(一)

离开学校来广州上班已经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 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值