拦截运行时java进程--xdubbo agent解读(1)

平常我们玩过jvisualvm监控java进程信息就知道,jvisualvm虽然说是jdk自带的,但如果我们自己要监控和替换某些java进程呢?我们如何玩?

根据作者目前的认知,介绍下jdk tools工具如何搬弄运行时java进程的

随便一个需求

运行java某进程正在跑一个用户,跑出的结果是格式:firstName.lastName    现在要将这个进程的结果改变,跑出 lastName.firstName


我们如何做?

先看下流程图吧

拦截运行时java进程--xdubbo agent解读(1)


具体做法

先做一个agent包

1、先定义User

拦截运行时java进程--xdubbo agent解读(1)

2、写个agent

拦截运行时java进程--xdubbo agent解读(1)

3、跑主进程

拦截运行时java进程--xdubbo agent解读(1)


4、定义jar 包的MANIFEST.MF

拦截运行时java进程--xdubbo agent解读(1)


5、定义jar 打包pom坐标

拦截运行时java进程--xdubbo agent解读(1)

这里注意了,要将tools.jar设置pom 否则会报错([ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project xdubbo-agent: Compilation failure: Compilation failure:
[ERROR] \springboot\sharding-share-work\xdubbo\xdubbo-agent\src\main\java\com\xdubbo\utils\JVMProcess.java:[3,0] ����: �����sun.jvmstat.monitor������
[ERROR] \springboot\sharding-share-work\xdubbo\xdubbo-agent\src\main\java\com\xdubbo\utils\JVMProcess.java:[26,12] ����: �Ҳ�������
[ERROR] \springboot\sharding-share-work\xdubbo\xdubbo-agent\src\main\java\com\xdubbo\utils\JVMProcess.java:[26,34] ����: �Ҳ�������
[ERROR] \springboot\sharding-share-work\xdubbo\xdubbo-agent\src\main\java\com\xdubbo\utils\JVMProcess.java:[31,16] ����: �Ҳ�������
[ERROR] \springboot\sharding-share-work\xdubbo\xdubbo-agent\src\main\java\com\xdubbo\utils\JVMProcess.java:[31,58] ����: �Ҳ�������
[ERROR] \springboot\sharding-share-work\xdubbo\xdubbo-agent\src\main\java\com\xdubbo\utils\JVMProcess.java:[33,37] ����: �Ҳ�������),无法编译

<dependency>
    <groupId>com.sun</groupId>
    <artifactId>tools</artifactId>
    <version>1.8</version>
    <scope>system</scope>
    <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>

 

6查看jar

拦截运行时java进程--xdubbo agent解读(1)

ok agent包已做好


再做个测试工具或叫client吧

1,重定义User,用来替换运行时进程的User

拦截运行时java进程--xdubbo agent解读(1)


2,写个测试类

拦截运行时java进程--xdubbo agent解读(1)

这里注意了要将tools.jar导入到idea或eclipse

拦截运行时java进程--xdubbo agent解读(1)

否则会报:

com.sun.tools.attach.VirtualMachine:no providers installed


好了,我们现在开测

java -jar 你的agent.jar

拦截运行时java进程--xdubbo agent解读(1)

运行client你要注入或监控或替代的jar

拦截运行时java进程--xdubbo agent解读(1)


其实这个玩法是很有用的,后续做监控或做别的处理,做到零侵入的,当然还有字节码的玩法比如:

从Javassist字节码动态注入说起--Dubbo源码系列解读(6) 


源码:https://github.com/luozhonghua/xdubbo