java探针利用了javaAgent + ASM字节码注入工具实现了动态修改类文件的功能。这是很多arthas和APM应用监控系统如Skywalking的基础。

首先什么是JavaAgent呢?

什么是javaAgent?

JavaAgent 是JDK 1.5 以后引入的,也可以叫做Java代理。是一种可以动态修改 Java 字节码的技术。Java 类编译之后形成字节码被 JVM 执行,在 JVM 在执行这些字节码之前获取这些字节码信息,并且通过字节码转换器对这些字节码进行修改,来完成一些额外的功能。

从用户使用层面来看,Java Agent 一般通过在应用启动参数中添加 -javaagent 参数添加 ClassFileTransformer 字节码转换器。 在 Java 虚拟机启动时,执 行main() 函数之前,Java 虚拟机会先找到 -javaagent 命令指定 jar 包,然后执行 premain-class 中的 premain() 方法。用一句概括其功能的话就是:main() 函数之前的一个拦截器
agent的代码与你的main方法在同一个JVM中运行;被同一个system classloader装载;被同一的安全策略 (security policy) 和上下文 (context) 所管理。

javaAgent可以实现的功能

1.javaAgent能够在执行java字节码生成Class对象之前进行拦截并对字节码进行修改
2.在jvm运行期间修改已经加载的字节码

通过以上两种就可以实现在一些框架或是技术的采集点进行字节码修改,可以对应用进行监控,或是对执行指定方法或是接口时额外添加操作(打印日志、打印方法执行时间、采集方法的入参和结果等)

使用入门:

  1. 编写一个maven项目,创建一个带有下列方法的java类。注意方法签名保持一致,参数Instrumentation inst也可省略。
public class MyAgent {public static void premain(String agentOps, Instrumentation inst) {System.out.println("Hello Main Method, I'm premain Method from agent, agentOps:" + agentOps);}
}
  1. pom文件里添加下面的插件
<build><plugins><plugin><!--引入maven-jar-plugin--><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.6</version><configuration><archive><manifestEntries><!--这里添加premain方法的类全路径,maven会你生成manifest文件--><premain-class>com.jun.sail.agent.MyAgent</premain-class></manifestEntries></archive></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>8</source><target>8</target></configuration></plugin></plugins>
</build>
  1. 然后mvn clean package打包即可。看下打好的jar包,可以看到META-INF文件夹有个MANIFEST.MF文件,就是刚才插件的功劳。

  2. 最后找个项目(jar包启动的项目,如springboot项目),启动时添加jvm参数-javaagent:E:\code\my-java-agent\target\my-java-agent-1.0-SNAPSHOT.jar指到刚才打好的代理jar包。可以跟参数,对应着premain方法里的agentOps参数

    即可在控制台看到先打印了Hello Main Method, I'm premain Method from agent, agentOps:123,然后才执行了main方法。

另外,其实IDE的debug模式启动时也是添加了javaAgent代理


从这里也可以看出Javaagent可以指定多个

上面只是简单介绍了JavaAgent的使用,那怎么去修改加载的类文件呢,这就涉及到了Instrumentation接口,这个才是agent实现更强大功能的核心所在!

Java探针之JavaAgent揭秘相关推荐

  1. Java探针技术--javaAgent

    一.JavaAgent概述 1.JavaAgent简述 使用Skywalking的时候,并没有修改程序中任何一行 Java 代码,这里便使用到了Java Agent 技术. 我们平时用过的很多工具都是 ...

  2. java探针之修改类字节码文件

    java探针利用了javaAgent + ASM字节码注入工具实现了动态修改类文件的功能.像skywalking和arthas都使用到了这个技术. 具体原理为: jdk1.5以后引入了javaAgen ...

  3. JAVA探针机制—Agent(一)

    JAVA探针机制-Agent(一) agent机制首次出现在JDK5版本,在JDK6版本得到升级并且正式被官方定义为agent原理. 首先要明确JavaAgent是一个JVM层面的插件,他可以利用JD ...

  4. 听云-java探针安装使用

    1.进入听云server,创建应用 进去点击新建应用 2.下载java探针 3.解压tingyun-agent-java.zip 拷贝tingyun目录到应用服务器的根目录 修改tingyun.pro ...

  5. Java探针--javaagent--使用/实例

    原文网址:Java探针--javaagent--使用/实例_IT利刃出鞘的博客-CSDN博客 简介 本文用示例介绍javaagent的用法. javaagent简介 JavaAgent 是JDK 1. ...

  6. 总结:Java探针技术

    一.介绍 探针技术通过JVM启动参数的 标准参数的-javaagent实现,原理是 在JVM加载class二进制文件的时候,动态的修改加载的class文件,在监控的方法前后添加计时器功能,用于计算监控 ...

  7. 探针技术-JavaAgent 和字节码增强技术-Byte Buddy

    能够基于Java Agent编写出普通类的代理 理解Byte Buddy的作用 能够基于Byte Buddy编写动态代理 1 Byte Buddy Byte Buddy 是一个代码生成和操作库,用于在 ...

  8. 【JAVA基础☞探针技术】Java探针-Java Agent技术

    个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 1.原理:基于javaAgent和Java字节码注入技术的java探针工具技术原理 2.原理分析 动态代理功能实现说明,我们利用ja ...

  9. java 字节码增强原理_深入浅出Java探针技术1--基于java agent的字节码增强案例

    Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...

最新文章

  1. Python文件与目录操作
  2. Linux日常命令使用记录
  3. 一休和尚 小布偶 晴天娃娃
  4. freerdp 解压安装_Linux下安装FreeRDP,连接windows远程桌面的好软件 | 学步园
  5. Canvas渲染会取代DOM吗?
  6. ChemDraw是这样预测诺氟沙星NMR谱
  7. 190420每日一句
  8. Java基础入门,Java完全自学手册下载
  9. Oracle和MySQL语法区别
  10. 社团管理系统软件测试,软件测试大作业-社团管理系统.doc
  11. 禁止恶意域名访问服务器方法
  12. VMware安装CentOS7以及CentOS官网下载自选镜像
  13. 大鱼吃小鱼java源代码_大鱼吃小鱼Java课程设计
  14. linux 电驴,开源电驴 MLDonkey 3.0.7 发布
  15. iOS环境股票行情报价功能历程
  16. excel如何批量删除缺失数据所在的行?
  17. Excel 2016图表标题不能输入中文,图表一直闪动
  18. spring boot整合MySQL数据库
  19. 使用Python 训练OpenCV Cascade分类器 - 1
  20. 递归算法(JS实现代码)

热门文章

  1. “贵阳大数据产业上得快、标准高、效果好”
  2. 泰凌微8258入门教程 基础篇②——BDT调试工具Tdebug实时查看全部变量
  3. html表格转换为json,jquery 将报表table内容转换为json格式
  4. 什么是知识体系?如何搭建层次和结构化思维?
  5. 计算中值——如何快速找到一个数组的中值
  6. Swiper 在网页开发中运用——简易教程
  7. python抽象语法树_Python AST –抽象语法树
  8. Vue 解决 npm run build 打包卡住不动的问题?
  9. 写作对于你而言,意味着什么
  10. 基于html扫雷游戏毕业论文,扫雷游戏的设计与开发毕业设计毕业论文正稿