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

一起看看JavaAgent到底是干啥用的

JavaAgent 简介
  • 定义: JDK提供的一种能力,允许开发者在运行时对已有class代码进行注入和修改。
  • 用途: 增强和修改类执行,如IntelliJ IDEA使用JavaAgent增强JVM行为实现调试功能。
JavaAgent 工作原理
  • premain 方法: JavaAgent的入口点,接收agent参数和Instrumentation实例。
  • transform 方法: 允许在类加载前修改字节码,使用字节码操作库(如ASM、Byte Buddy)。
实践 JavaAgent
  • 步骤:
    1. 实现 ClassFileTransformer 接口: 重写 transform 方法,实现字节码修改。
    2. 编写 MyAgent: 作为代理入口类,注册 ClassFileTransformer
    3. 配置Jar信息: 打包代码为Jar包,配置MANIFEST.MF指定启动类和相关属性。
方法执行耗时统计实现
  • CostTransformer: 限定只对特定类名后缀的类进行操作,实现方法耗时的统计。
    • 时间记录: 在方法执行前后插入时间记录代码,计算耗时。
    • 代码示例: 使用javassist库对UserControllertestCostTime方法进行字节码修改。
代理入口类 (MyAgent)
  • premain 方法: 注册 CostTransformer 实例到Instrumentation实例。
  • 注意: agentmain通常用于JavaAgent附着启动,本文主要介绍 premain
Jar包配置
  • MANIFEST.MF: 配置文件,指定JavaAgent的启动类和属性。
    • Premain-Class: 指定入口类。
    • Can-Redefine-ClassesCan-Retransform-Classes: 允许类重定义和重转换。
使用JavaAgent
  • 启动方式:
    • 使用 -javaagent 选项启动Java应用程序。
    • 使用Java Attach API在运行时附加代理。
http://www.lryc.cn/news/417914.html

相关文章:

  • k8s工作负载控制器--DaemonSet
  • 探索Python文档自动化的奥秘:MkDocs的神奇之旅
  • 树莓派边缘计算网关搭建:集成MQTT、SQLite与Flask的完整解决方案
  • 如何通过GD32 MCU内部ADC参考电压通道提高采样精度?
  • Centos安装OpenSearch
  • 【pkill pgrep】Centos/Linux pkill命令详细介绍
  • Java如何使用 HTTP 请求下载图片
  • ARM/Linux嵌入式面经(二十):地平线嵌入式开发
  • 无人机竞速赛
  • 【书生大模型实战营(暑假场)】入门任务二 Git 关卡
  • OSPF小实验
  • 蛋白质生物学:从序列到结构和疾病 下载并同时打开1LYZ和1H6M的PDB文件(提交图片)。描述这种蛋白质的二级和三级结构。(10分)
  • 用VBA在Word中随机打乱单词表,进行分列
  • UNI-APP_点击,长按,触摸,结束触摸事件
  • 【QT】Qt 音视频
  • CSP-J 复赛 模拟题6
  • 拷贝函数的三种调用方式
  • C语言 | Leetcode C语言题解之第327题区间和的个数
  • 统计学:条件概率模型
  • 前端工程师学习springboot2.x之配置idea热更新实现高效率开发节奏
  • 文本rerank与图像rerank
  • Docker 在 Windows 系统下的使用指南:数据卷和数据库
  • [数据集][目标检测]轴承缺陷划痕检测数据集VOC+YOLO格式1166张1类别
  • 将本地微服务发布到docker镜像二:
  • 前端构建工具|vite快速入门
  • 拯救PyCharm:击退IDE内存泄漏的策略
  • 在vue3的开发环境中为什么使用vite而不是用webpack
  • mybatis结合generator进行分页插件PluginAdapter开发
  • 面试:ArrayList和LinkedList
  • 【uniapp】uniapp+vue2微信小程序实现分享功能