【进阶篇】二、实现Java Agent的静态加载和动态加载

文章目录

  • 1、Java Agent
  • 2、两种加载模式
    • 静态加载模式
    • 动态加载模式
  • 3、静态加载模式实现
  • 4、动态加载的实现

1、Java Agent

通过Java Agent,生成一种特殊的jar包(一种工具),业务程序可以主动去调用jar包里的方法。比如下面这个有打印内存情况功能的agent:

在这里插入图片描述

2、两种加载模式

让Java程序执行Java Agent程序中的代码,实现方式:

静态加载模式

在Java程序开始执行前,先执行Agent的代码。在Java Agent的项目中编写一个premain的方法,并打包成jar包:

//premain,即在用户的main方法执行之前
public static void premain(string agentArgs, Instrumentation inst)

如果自己的程序是test.jar,可执行:

java -javaagent:./agent.jar -jar test.jar

如此,JVM将会加载agent中的代码去执行。premain方法会在主线程中执行:

在这里插入图片描述

动态加载模式

连接用户的Java进程,随时让Java Agent的代码执行,适用于Arthas类似的诊断工具。实现动态加载模式,需要在Java Agent项目中编写一个agentmain方法,并打成jar包:

public static void agentmain(string agentArgs, Instrumentation inst)

以下代码可以让Java Agent的代码在指定的Java进程中执行:

//动态连接到24200进程ID的java程序
VirtualMachine vm = VirtualMachine.attach("24200");//加载java agent的jar并执行
vm.loadAgent("itheima-jvm-java-agent-jar-with-dependencies.jar");

如此,Java Agent的jar就会被执行。和静态加载的permain不同,agentmain方法的执行是在一个单独的线程里:

在这里插入图片描述

一点想法:感觉AOP和Java Agent的区别就是:前者是开发者在自己的程序里写的,且增强的时机更灵活。后者则独立于开发者自己的程序,能适用于所有的Java程序。

3、静态加载模式实现

  • 创建Java Agent的maven项目,添加maven-assembly-plugin插件,以便打出java agent的jar包
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><configuration><!--将所有的依赖都打入同一个jar包中,配置了这个,以后打的Agent包,既有我写的Agent代码,也有上面引入的依赖的代码--><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><!--指定java agent相关的配置文件--><archive><manifestFile>src/main/resources/MANIFEST.MF</manifestFile></archive></configuration></plugin></plugins>
</build>
  • 定义个类,写premain方法,写代理要执行逻辑
public class AgentMain {public static void premain(String agentArgs, Instrumentation inst) {System.out.println("premain方法执行了...");}}
  • 编写MANIFEST.MF文件,写Java Agent的属性
Manifest-Version: 1.0
Premain-Class: com.llg.AgentMain
Can-Redefine-Classes: true
Can-Retransform-Classes: true
Can-Set-Native-Method-Prefix: true
  • 使用maven-assembly-plugin进行打包

在这里插入图片描述

  • 让另一个普通的Java程序,-javaagent启动,静态代理成功:

在这里插入图片描述

4、动态加载的实现

  • 创建Java Agent的maven项目,添加maven-assembly-plugin插件,以便打出java agent的ja(同上)
  • 定义个类,写agentmain方法,写代理要执行逻辑
public class AgentMain {public static void agentmain(String agentArgs,Instrumentation inst){System.out.println("agentmain执行了...");}}
  • 编写MANIFEST.MF文件,写Java Agent的属性
Manifest-Version: 1.0
Agent-Class: com.llg.AgentMain
Can-Redefine-Classes: true
Can-Retransform-Classes: true
Can-Set-Native-Method-Prefix: true
  • 使用maven-assembly-plugin进行打包(同上)
  • 启动普通的Java程序
  • 写个main方法,动态连接到运行中的java程序并加载执行Java Agent的Jar,实现动态代理(以后这个main方法就可以写在工具里,让用户只输入一个自己Java进程的PID,帮用户把传入到这个main,动态代理)
public class Test {public static void main(String[] args) throws  Exception {//传入用户Java进程的PID,实现连接VirtualMachine vm = VirtualMachine.attach("45627");//执行Java Agent的里的agentmain方法vm.loadAgent("D:\\jmh2\\llg-agent\\target\\llg-agent-1.0-SNAPSHOT-jar-with-dependencies.jar");}
}
  • 效果:

在这里插入图片描述

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

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

相关文章

奎芯科技:智能时代的芯片上游企业如何突破?

半导体IP&#xff08;Intellectual Property&#xff0c;知识产权&#xff09;&#xff0c;通常也称作IP核&#xff08;IP core&#xff09;&#xff0c;指芯片设计中预先设计、验证好的功能模块&#xff0c;主要服务于芯片设计&#xff0c;因部分通用功能模块在芯片中被反复使…

Linux磁盘扩容并设置挂载点

背景 使用pve创建了一个虚拟机&#xff0c;各种环境配置都安装好了之后发现分配的磁盘空间太小了&#xff0c;默认的就30多个G&#xff0c;这还没咋玩呢就满了&#xff0c;像扩容却找遍了这个pve都没找到扩容按钮&#xff0c;并且我这个磁盘不是lvm结构的&#xff0c;所以好像…

工业网络互联互通问题的探讨——青创智通

工业物联网解决方案-工业IOT-青创智通 随着科技的不断发展&#xff0c;工业网络已经成为现代工业生产中不可或缺的一部分。工业网络能够将各个生产设备、传感器、执行器等连接在一起&#xff0c;实现信息的共享和协同工作&#xff0c;从而提高生产效率、降低能耗、提升产品质量…

python如何判断图片为黑白还是彩色

基本原理 灰度图分两种情况&#xff1a; 单通道的图片 RGB 三通道的图片&#xff0c;但是每个通道的值相等 对于单通道的图片只需要判断图片的通道值是否为1 对于RGB模式的图片&#xff0c;情况稍稍复杂些。理论上只需判断RGB三个通道的值是否相等&#xff0c;但是现实中灰度…

局域网内部使用的视频会议系统推荐

随着远程办公的普及和全球化的发展趋势&#xff0c;企业需要一个高效、灵活、安全的音视频会议解决方案&#xff0c;以支持远程办公的协同工作、跨地域沟通等需要。私有化音视频会议就是一个适合企业自身部署的解决方案。它不仅能够满足企业信息管理和保密的需求&#xff0c;而…

广告电商模式:购物得积分 看广告还能赚钱!

互联网时代的浪潮中&#xff0c;电子商务与广告行业日新月异&#xff0c;不断碰撞出全新的火花。在这种背景下&#xff0c;广告电商模式作为一种创新的商业模式崭露头角&#xff0c;它以广告与电商的深度融合为核心&#xff0c;通过精准化的营销手段与用户的积极参与&#xff0…

基于SpringBoot+Vue的咖啡商城(带文档)

项目介绍: 基于SpringBootVue的咖啡商城&#xff08;带文档&#xff09; 网上咖啡商城系统&#xff0c;咖啡商城系统 前后端分离&#xff0c;Java开发&#xff0c;Vue框架&#xff0c;Redis分布式缓存&#xff0c;MyBatis 运行环境&#xff1a;JDK1.8MySQLMavenRedisNode.js 项…

前端开发攻略---面对复杂多变的甲方需求,一个成熟的程序员该如何应对呢?独门秘籍

以下招式&#xff0c;过于狠毒&#xff0c;谨慎使用&#xff0c;如有后果&#xff0c;概不负责 1、甲方要求优化首页白屏 优化前 setTimeout(() > {createApp(App).mount(#app)}, 3000) 优化后 setTimeout(() > {createApp(App).mount(#app)}, 1000) 注意&#xff1a;记得…

高通user版本diag口无法正常连接QXDM调试

modem同事调试网络问题&#xff0c;需要连QXDM读取设备信息和抓取log&#xff0c;正常不做修改的user版本只有9091的端口&#xff0c;但是不显示设备&#xff0c;无法正常连接调试. 出于对厂商安全的考虑&#xff1a; 修改位置: device/qcom/sepolicy_vndr/generic/vendor/co…

【灵境矩阵】零代码创建AI智能体之行业词句助手

欢迎来到《小5讲堂》 这是《灵境矩阵》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 创建智能体选择创建方式零代码 基础配置头像名称简介指令开场白…

Fiddler:网络调试利器

目录 第1章:Fiddler简介和安装 1.1 Fiddler概述 1.2 Fiddler的安装步骤 步骤1:下载Fiddler 步骤2:运行安装程序 步骤3:启动Fiddler 1.3 配置Fiddler代理 配置操作系统代理 配置浏览器代理 Google Chrome Mozilla Firefox 第2章:Fiddler界面和基本操作 2.1 Fi…

鸿蒙内核源码分析 (物理内存篇) | 怎么管理物理内存

如何初始化物理内存&#xff1f; 鸿蒙内核物理内存采用了段页式管理&#xff0c;先看两个主要结构体。结构体的每个成员变量的含义都已经注解出来&#xff0c;请结合源码理解. #define VM_LIST_ORDER_MAX 9 //伙伴算法分组数量&#xff0c;从 2^0&#xff0c;2^1&#…

【vue】ref 和 reactive 对比

ref&#xff1a;存储单个数据&#xff0c;如数值&#xff0c;字符串reactive&#xff1a;存储复杂数据&#xff0c;如对象&#xff0c;数组 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"vie…

创建vue3项目遇到的部分问题及解决方式

export default defineConfig({server: {// https: true,// 启用https协议&#xff0c;默认是HTTP协议host: true, // 监听所有地址port: 1314,// 前端项目启动的端口号open: true,// 开启代理cors: false, // 为开发服务器配置 CORSproxy: {^/api: {target: ,// 服务器地址cha…

P24 C# 类

&#xff08;1&#xff09;、类修饰符&#xff1a; new: public&#xff1a;外部可自由访问 protected: 访问限制在继承链上 internal: 在当前的项目中&#xff0c;可以自由访问&#xff0c;默认的访问级别 private: 只能修饰类的成员类&#xff08;内部类的可以&#x…

(Java)数据结构——图(第七节)Folyd实现多源最短路径

前言 本博客是博主用于复习数据结构以及算法的博客&#xff0c;如果疏忽出现错误&#xff0c;还望各位指正。 Folyd实现原理 中心点的概念 感觉像是充当一个桥梁的作用 还是这个图 我们常在一些讲解视频中看到&#xff0c;就比如dist&#xff08;-1&#xff09;&#xff0…

WooCommerce的使用方式和特点

WooCommerce是一款基于WordPress的开源电子商务插件&#xff0c;它允许用户在WordPress网站上创建和管理在线商店。以下是WooCommerce的一些使用方式和特点。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.产品管理&#xff1a;Woo…

bugku-web-file_get_contents

<?php extract($_GET); if (!empty($ac)){$f trim(file_get_contents($fn));if ($ac $f){echo "<p>This is flag:" ." $flag</p>";}else{echo "<p>sorry!</p>";} } ?> 这里涉及到几个不常用的函数 这里直接构…

【python处理数据的函数】---误区2

python是 Guido van Rossum设计的一款面向对象的编程语言。首次发布时间为1991 年 2 月。受到 C 与 C、Java 与 Perl、Lisp 与 Haskell语言的启示&#xff0c;但 ABC 语言对 Python语 言有主要的影响&#xff0c;Python 的创立者吉多范罗苏姆&#xff08;Guido van Rossum&…

2024年 Mathorcup高校数学建模竞赛(B题)| 甲骨文识别 | 特征提取,图像分割解析,小鹿学长带队指引全代码文章与思路

我是鹿鹿学长&#xff0c;就读于上海交通大学&#xff0c;截至目前已经帮200人完成了建模与思路的构建的处理了&#xff5e; 本篇文章是鹿鹿学长经过深度思考&#xff0c;独辟蹊径&#xff0c;通过神经网络解决甲骨文识别问题。结合特征提取&#xff0c;图像分割等多元算法&…