Java Agent初探

1:Java Agent简介

Java Agent 这个技术出现在 JDK1.5 之后,对于大多数人来说都比较陌生,但是多多少少又接触过,实际上,我们平时用的很多工具,都是基于 Java Agent 实现的,例如常见的热部署 JRebel,各种线上诊断工具如阿里开源的 Arthas,还有调用链追踪的SKywalking。

其实 Java Agent 一点都不神秘,也是一个 Jar 包,只是启动方式和普通 Jar 包有所不同,对于普通的Jar包,通过指定类的 main 函数进行启动,但是 Java Agent 并不能单独启动,必须依附在一个 Java 应用程序运行。

我们可以使用 Agent 技术构建一个独立于应用程序的代理程序,用来协助监测、运行甚至替换其他 JVM 上的程序代码,使用它可以实现虚拟机级别的 AOP 功能等等。

2:Java Agent开发

import java.lang.instrument.Instrumentation;/*** 接下来还需要创建 MANIFEST.MF 文件并打包,这里我们直接使用 maven-assembly-plugin 打包插件来完成这两项功能。<br/>* 在 pom.xml 中引入 maven-assembly-plugin 插件并添加相应的配置,请移步到pom.xml。<br/>* 打包命令:mvn package -Dcheckstyle.skip -DskipTests<br/>* 启动脚本添加:-javaagent:javaagent路径/demo-agent.jar<br/>** @author: Cookie.Joo* @create: 2020/11/24*/
public class TestAgent {/*** premain() 方法有两个重载,如下所示,如果两个重载同时存在,【1】将会被忽略,只执行【2】:* @param agentArgs -javaagent 命令携带的参数.* @param inst 操作类的重要接口.**//*** 【1】一个参数方法** @param agentArg*/public static void premain(String agentArg) {System.out.println("this is a java agent only one arg");System.out.println("参数:" + agentArg + "\n");}/*** 【2】两个参数方法** @param agentArg* @param inst*/public static void premain(String agentArg, Instrumentation inst) {System.out.println("agent premain two args");System.out.println("参数:" + agentArg + "\n");}
}

打包需要特殊处理,这里咱们用maven插件来完成,否则是要在META-INF 目录中的生成MANIFEST.MF文件编写一点代码,其实也就是描述你的premain在哪的问题,用插件自动解决该问题。

<build><finalName>demo-agent</finalName><plugins><!-- 请看这个plugin即可 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>2.4</version><configuration><appendAssemblyId>false</appendAssemblyId><!-- 将TestAgent的所有依赖包都打到jar包中--><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><archive><!-- 添加MANIFEST.MF中的各项配置--><manifest><!-- 添加 mplementation-*和Specification-*配置项--><addDefaultImplementationEntries>true</addDefaultImplementationEntries><addDefaultSpecificationEntries>true</addDefaultSpecificationEntries></manifest><!-- 将 premain-class 配置项设置为com.xxx.TestAgent--><manifestEntries><Can-Retransform-Classes>true</Can-Retransform-Classes><Can-Redefina-Classes>true</Can-Redefina-Classes><Premain-Class>com.demo.agent.TestAgent</Premain-Class></manifestEntries></archive></configuration><executions><execution><!-- 绑定到package生命周期阶段上 --><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>8</source><target>8</target></configuration></plugin></plugins>
</build>

最后打包成jar,META-INF 目录中生成MANIFEST.MF如下描述文件

Manifest-Version: 1.0
Implementation-Title: demo-agent
Implementation-Version: 0.0.1-SNAPSHOT
Archiver-Version: Plexus Archiver
Built-By: cookiejoo
Agent-Class: com.demo.agent.TestAgent
Specification-Title: demo-agent
Implementation-Vendor-Id: demo-agent
Can-Redefina-Classes: true
Premain-Class: com.demo.agent.TestAgent
Can-Retransform-Classes: true
Created-By: Apache Maven 3.6.1
Build-Jdk: 1.8.0_77
Specification-Version: 0.0.1-SNAPSHOT

3:Java Agent启动

随便找个main方法启动一下,启动应用必须加-javaagent参数,代码图中已经给出实例
在这里插入图片描述
最后看结果,premain方法两个参数的生效且在main方法之前就执行了
在这里插入图片描述
这就是Java Agent的一个入门程序,大概来认识一下,下次再来点高级的写法,比如通过Java Agent修改动态修改代码返回值,新增字段等骚操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/130424.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器数据恢复-DS5300存储raid5硬盘出现坏道离线的数据恢复案例

服务器数据恢复环境&#xff1a; 某单位一台DS5300存储&#xff0c;1个主机4个扩展柜&#xff0c;组建了2组RAID5&#xff08;一组27块硬盘&#xff0c;一组23块盘&#xff09;。27块盘的那组RAID5阵列存放Oracle数据库文件&#xff0c;存储系统一共分了11个卷。 服务器故障&a…

JVM的内存模型

一、JVM的内存模型 1.1、目标 内存模型是用来描述JVM内部的内存结构和内存管理的模型。它定义了JVM在运行Java程序时所需要的各种内存区域&#xff0c;以及每个内存区域的作用和特点。 1.2、结构划分 1.2.1、栈 每个线程在执行Java方法时会创建一个栈帧&#xff08;Stack …

Prometheus和grafana安装配置手册

1.简介 本文档为prometheus和grafana安装配置手册&#xff0c;prometheus和grafana的内容、和操作过程&#xff0c;详细介绍了服务监控配置、dashboard配置、告警配置等操作。 2.部署说明 Prometheus基于Golang编写&#xff08;需要安装&#xff09;&#xff0c;编译后的软件…

Transformer为什么如此有效 | 通用建模能力,并行

目录 1 更强更通用的建模能力 2 并行计算 3 大规模训练数据 4 多训练技巧的集成 Transformer是一种基于自注意力机制的网络&#xff0c;在最近一两年年可谓是大放异彩&#xff0c;我23年入坑CV的时候&#xff0c;我看到的CV工作似乎还没有一个不用到Transformer里的一些组…

实现一个简单的线性回归和多项式回归(2)

对于多项式回归&#xff0c;可以同样使用前面线性回归中定义的LinearRegression算子、训练函数train、均方误差函数mean_squared_error&#xff0c;生成数据集create_toy_data,这里就不多做赘述咯~ 拟合的函数为 def sin(x):y torch.sin(2 * math.pi * x)return y1.数据集的建…

电机控制——高数基础

最近开始学习电机控制&#xff0c;将会写一个系列学习笔记&#xff0c;作为一个新手&#xff0c;肯定有理解不到位或错误的地方&#xff0c;仅供大家参考&#xff0c;欢迎交流指正。 先复习一下微积分和自动控制原理&#xff0c;大学学的忘得一干二净。本文大多摘自维基百科 …

信息系统项目管理师第四版学习笔记——项目进度管理

项目进度管理过程 项目进度管理过程包括&#xff1a;规划进度管理、定义活动、排列活动顺序、估算活动持续时间、制订进度计划、控制进度。 规划进度管理 规划进度管理是为规划、编制、管理、执行和控制项目进度而制定政策、程序和文档的过程。本过程的主要作用是为如何在…

uniapp获取公钥、MD5,‘keytool‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

获取MD5、SHA1、SHA256指纹信息 通过命令的形式获取 winr调出黑窗口cd到证书所在目录输入keytool -list -v -keystore test.keystore,其中 test.keystore为你的证书名称加文件后缀按照提示输入你的证书密码&#xff0c;就可以查看证书的信息 通过uniapp云端查看(证书是在DClou…

微服务 BFF 架构设计

在现代软件开发中&#xff0c;由于程序、团队、数据规模太大&#xff0c;需要把企业的业务能力进行复用&#xff0c;将领域服务剥离&#xff0c;提供通用能力&#xff0c;避免重复建设和代码&#xff1b;另外服务功能的弹性能力不一样&#xff0c;比如定时任务、数据同步明确的…

目标识别项目实战:基于Yolov7-LPRNet的动态车牌目标识别算法模型(二)

前言 目标识别如今以及迭代了这么多年&#xff0c;普遍受大家认可和欢迎的目标识别框架就是YOLO了。按照官方描述&#xff0c;YOLOv8 是一个 SOTA 模型&#xff0c;它建立在以前 YOLO 版本的成功基础上&#xff0c;并引入了新的功能和改进&#xff0c;以进一步提升性能和灵活性…

```,```中间添加 # + 空格 + 空行后遇到的底部空行出错,书接上回,处理空行

【python查找替换&#xff1a;查找空行&#xff0c;空行前后添加&#xff0c;中间添加 # 空格 空行后遇到的第1行文字&#xff1f; - CSDN App】http://t.csdnimg.cn/QiKCV def is_blank(line):return len(line.strip()) 0txt 时间戳&#xff1a; ("%Y-%m-%d %H:%M:…

【Solidity】智能合约案例——①食品溯源合约

目录 一、合约源码分析&#xff1a; 二、合约整体流程&#xff1a; 1.部署合约 2.管理角色 3.食品信息管理 4.食品溯源管理 一、合约源码分析&#xff1a; Producer.sol:生产者角色的管理合约&#xff0c;功能为&#xff1a;添加新的生产者地址、移除生产者地址、判断角色地址…