1. 前言 为什么会接触JavaAgent呢?
这起源于笔者最近在读Dubbo的源码,Dubbo有一个很有意思的功能——SPI,它可以根据运行时的URI参数,自适应的调用特定的实现类 。大致的原理其实也能猜到,无非就是生成一个代理类,反射解析URI参数里的值,然后再调用对应的实现类 。虽然大概可以猜到实现原理,但毕竟只是猜想,抱着科学严谨的精神,还是想看看Dubbo的实现源码,此时就有了一个想法,能不能把Dubbo生成的代理对象的Class类Dump下来,然后反编译看看它的源码呢?
理论上是完全可行的,阿里有一个很好用的开源工具Arthas,它的jad命令就支持对JVM已经加载的类进行反编译查看源码,笔者把Arthas项目源码down下来了,查看以后发现,需要用到JavaAgent技术 。
2. JavaAgent规范 在JDK1.5以后,我们可以使用JavaAgent技术,以「零侵入」的方式对Java程序做增强 。例如阿里云的Arms应用监控服务,就可以通过JavaAgent的方式接入一个探针,它会把应用的运行数据上报到阿里云,开发者可以在后台查看到应用的运行数据 。这种方式,不需要我们对应用做任何改动,就可以轻松实现应用监控 。
JavaAgent是一种规范,它分为两类:主程序运行前Agent、主程序运行后Agent 。它可以在JVM加载Class文件前,对字节码做修改,甚至允许修改已经加载过的Class,这样我们就可以对应用做增强、以及实现代码热部署 。
主程序运行前Agent的步骤:
1、编写Agent类,该类必须有静态方法premain() 。
public class MyAgentClass {// JVM优先执行该方法public static void premain(String agentArgs, Instrumentation inst) {System.err.println("main before...");}public static void premain(String agentArgs) {System.err.println("main before...");}}
2、在resources/me
推荐阅读
- java实现生产者消费者问题 java生产者消费者代码
- java编程自学教程 java基础入门知识点
- 分享这5种核心框架 java界面框架有哪些
- 初学者快速画眉秘诀分享 眉毛怎么画
- 2者区别对比分析 c语言和java区别有哪些
- 握毛笔姿势 初学者怎么握毛笔
- 免费网站java源码大全 java项目案例分析
- 附java环境搭建及配置教程 java环境配置不成功的原因
- java插件安装方法 jquery如何使用类选择器
- java连接数据库步骤 java连接mysql数据库代码