当前位置: 首页 > news >正文

javaagent字节码增强浅尝

概述

  • javaagent 技术广泛应用于对代码的增强,比如统计方法执行时间、GC 信息打印、分布式链路跟踪等;
  • 实现方式包括 javassist 和 bytebuddy,bytebuddy 是对 javassist 的改进;
  • 类似于 spring 中的 AOP;

Instrumentation 实现对 main 方法增强

说明:

  • 新建两个项目,一个打包成增强 jar 包,一个写待增强业务代码;
  • 可通过定义注解进行优化;
  • 注意 maven 打包插件;

1)新建一个 maven 项目,引入 pom 依赖,并指定增强类:

<dependencies><!-- javaagent --><dependency><groupId>javassist</groupId><artifactId>javassist</artifactId><version>3.12.1.GA</version><type>jar</type></dependency>
</dependencies><build><plugins><!-- 测试javaagent相关 --><plugin><!-- 打普通的jar包 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.2</version><configuration><!-- 打包配置 --><archive><manifestEntries><Project-name>${project.name}</Project-name><Project-version>${project.version}</Project-version><!-- main方法之前需要处理的类 --><Premain-Class>com.firechou.test.javaagent.FireAgent</Premain-Class></manifestEntries></archive><skip>true</skip></configuration></plugin></plugins>
</build>

注意插件中 Premain-Class 指定的是增强类。

2)新建代理类,编写增强逻辑

public class FireAgent {/*** 在Instrumentation中有对应的说明:当jvm以代理类的方式启动时,Instrumentation的实例将传递给premain方法* @param args* @param instrumentation*/public static void premain(String args, Instrumentation instrumentation){System.out.println("agent premain(), args: " + args);}}

3) 打包成 jar
执行打包命令:
image.png
注意:不要执行 Plugins》jar》jar:jar 命令,会提示找不到目标类。
生成增强 jar 包如下:
image.png

4)在另一个项目中,新建业务代码类,即被增强的逻辑

public class FireAgentMainTest {public static void main(String[] args) {System.out.println("hello world");}
}

添加 JVM 运行参数:

-javaagent:test-javaagent/target/test-javaagent-1.0-SNAPSHOT.jar=name=jar&age=33

image.png
运行结果:

agent premain(), args: name=jar&age=33
hello world
http://www.lryc.cn/news/248672.html

相关文章:

  • 计算机组成原理-Cache替换算法
  • Adobe 家族系列download
  • 97.STL-查找算法 find
  • 如何应对雨天飞行的挑战?无人机机库防护能力解析
  • 机器学习笔记 - 3D数据的常见表示方式
  • 【Node.js】解决npm报错:RequestError: unable to verify the first certificate
  • 语言模型文本处理基石:Tokenizer简明概述
  • 淘宝商品详情数据接口(店铺搬家、数据分析、代购商城、ERP选品、无货源铺货、品牌监控)
  • 面试篇之微服务(一)
  • 智慧科研助力科研数据的分析处理
  • el-select实现分屏效果
  • 微信小程序本地和真机调试文件上传成功但体验版不成功
  • windows系统用nginx部署web应用
  • 如何利用Python进行数据归一化?
  • Linux 基本语句_13_消息队列
  • Maven——仓库
  • Pandas:一个实用高效的Python数据处理库
  • Spring第三课,Lombok工具包下载,对应图书管理系统列表和登录界面的后端代码,分层思想
  • DDoS高防IP到底是什么?
  • el-row错位问题解决
  • torch indices x[indices] 内存不足崩溃,python进程锁报错。
  • 第二证券:机构争分夺秒抢滩 金融大模型落地为时尚早
  • C#WPF使用MaterialDesign 显示带遮罩的对话框
  • Nuxt.js:下一代Web开发框架的革命性力量
  • 【JavaEE初阶】死锁问题
  • uniapp 打包的 IOS打开白屏 uniapp打包页面空白
  • 在 Redis 中使用 JSON 文档:命令行界面(CLI)和 Navicat 集成
  • Win Server 2019远程桌面服务部署
  • vue3-在自定义hooks使用useRouter 报错问题
  • 深度学习框架:Pytorch与Keras的区别与使用方法