网站首页 > 精选教程 正文
最近在学习Java Agent,说一下学习的一些心得。
JavaAgent一种在加载类的时候,对字节码进行修改的技术,中文含义Java探针技术。
其原理:
JavaAgent是jdk1.5以后引入的技术,是一种在JVM加载class二进制文件的时候,利用ASM动态的修改加载的class文件的JAVA代理技术。
创建agent
上代码: 第一步:创建一个class类,创建两个方法
import java.lang.instrument.Instrumentation;
/**
* @author fade
* @Title: MyAgent
* @ProjectName my-agent
* @Description: TODO
* @date 2021/4/123:51 下午
*/
public class MyAgent {
/**
* 该方法在main方法之前运行,与main方法运行在同一个JVM中
* 并被同一个System ClassLoader装载
* 被统一的安全策略(security policy)和上下文(context)管理
*
* @param agentOps
* @param inst
* @author fade
* @create 2021/4/123:51 下午
*/
public static void premain(String agentOps, Instrumentation inst) {
System.out.println("=========premain方法执行========");
System.out.println(agentOps);
}
/**
* 如果不存在 premain(String agentOps, Instrumentation inst)
* 则会执行 premain(String agentOps)
*
* @param agentOps
* @author fade
* @create 2021/4/123:51 下午
*/
public static void premain(String agentOps) {
System.out.println("=========premain方法执行2========");
System.out.println(agentOps);
}
}
public static void agentmain(String args, Instrumentation inst)
或 public static void agentmain(String args)
方法。并且在二者同时存在时以前者优先。args和inst与premain中的一致。
第二步: 第一种方式(maven方式) pom文件中添加:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<Premain-Class>com.sage.agent.MyAgent</Premain-Class>
<Agent-Class>com.sage.agent.MyAgent</Agent-Class>
<Can-Redefine-Classes>true</Can-Redefine-Classes>
<Can-Retransform-Classes>true</Can-Retransform-Classes>
</manifestEntries>
</archive>
</configuration>
</plugin>
Premain-Class 、Agent-Class指向agent的主类,即刚才创建的MyAgent。
第二种方式(配置文件方式) 在resource中创建并设置MANNIFEST.MF,指定Agent-Class:
Manifest-Version: 1.0
Agent-Class: com.sage.agent.MyAgent
Created-By: 1.6.0_29
一个简单的agent就实现了
如何加载 Java Agent
通过JVM参数 -javaagent:**.jar 启动,程序启动的时候,会优先加载Java Agent,并执行其 premain 方法,这个时候,其实大部分的类都还没有被加载,这个时候可以实现对新加载的类进行字节码修改,但是如果 premain 方法执行失败或抛出异常,那么JVM会被中止,这是很致命的问题。
作者|fade|掘金
猜你喜欢
- 2024-12-02 jacoco 生成单测覆盖率报告
- 2024-12-02 BOS分布式链路追踪产品揭秘
- 2024-12-02 「一发入魂」基于Skywalking实现服务链路追踪|监控|告警
- 2024-12-02 如何在字节码层面实现方法拦截:探索 Java Agent 与 ASM 的魅力
- 2024-12-02 非Spring管理Bean如何添加AOP呢?
- 2024-12-02 Flink实时计算在贝壳的实践及应用
- 2024-12-02 K8S官方java客户端之四:内部应用
- 2024-12-02 All in one:如何搭建端到端可观测体系
- 2024-12-02 skywalking快速入门
- 2024-12-02 几款流行监控系统简介
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)