动态追踪之java agent

本文介绍了Java Agent技术,一种允许在JVM级别进行AOP操作的工具。文章详细阐述了Java Agent的使用,包括实现ClassFileTransformer接口、编写agent类和配置文件。Java Agent的加载分为静态和动态两种方式,静态加载在应用启动时修改字节码,动态加载则可在运行时附加到JVM。文中通过示例展示了如何进行静态和动态加载,并比较了两者之间的区别。Java Agent广泛应用在调试、热部署、诊断工具和性能分析等领域。
摘要由CSDN通过智能技术生成

Java Agent是什么?

Java Agent技术,也被称为Java代理、Java探针,从JDK1.5它就出现了,它允许程序员利⽤其构建⼀个独⽴于应⽤程序的代理程序。Java Agent本身就是个jar包,它利用JVM提供的Instrumentation API来更改加载在JVM中的现有字节码,Java Agent可以理解为是JVM级别的AOP。

Java Agent 怎么用?

Java Agent使用包括两个部分:代码实现和配置文件。

  • 代码实现:这部分包括3个步骤:
  1. 实现ClassFileTransformer接口并重写transform方法。 ClassFileTransformer用于在JVM加载实现类之前转换类文件。
  2. 编写agent类 agent类中有两个方法:premain方法和agentmain方法。
    • premain用于在代理方法执行前调用,在 JVM 启动时必须为其指明Java代理。它有两个实现
    • agentmain用于在代理方法运行时执行。
  3. 修改配置文件并打包
  • 配置文件:配置文件名为MANIFEST.MF,需放在META-INF文件夹下或者在maven中配置。
Premain-Class:表示实现premain方法的类。
Agent-Class:表示实现agentmain方法的类。
Can-Redefine-Classes:表示Java agent是否可以重新定义被代理类。
Can-Retransform-Classes:表示是否允许Java Agent转换被代理类。

Java Agent的加载

Java Agent的加载分为静态加载和动态加载。

静态加载

在应用程序启动时加载Java代理称为静态加载,静态加载在任何代码执行之前在启动时修改字节码。它是以premain方法为入口的,premain方法有两个重载方法:

public static void premain(String agentArgs, Instrumentation inst)
public static void premain(String agentArgs)
  • agentArgs:字符串参数,通过-javaagent传递
  • inst:java.lang.instrument.Instrumentation类对象

JVM 会优先加载带 Instrumentation 对象参数的方法,加载成功忽略第二种;如果第一种没有,则加载第二种方法。

下面写个简单的例子玩一下静态加载:

  1. 新建一个maven项目并引入javassist包
 <dependency>
    <groupId>org.javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.29.2-GA</version>
</dependency>
  1. 新建一个ClassFileTransformer接口实现类PrintMethodCostTransformer,用户打印方法耗时
public class PrintMethodCostTransformer implements ClassFileTransformer {

    private final String targetClassName;

    public PrintMethodCostTransformer(String targetClassName) {
        this.targetClassName = targetClassName;
    }

    @Override
    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) {
        try {
            if (className != null) {
                className = className.repla
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值