Java Agent - episode 1

JavaAgent是一种利用JavaInstrumentationAPI实现在JVM层面修改类字节码的技术。预主方法(premain)在JVM启动时调用,允许静态和动态织入。静态agent在启动应用时加载,动态agent则能在运行时注入。ClassFileTransformer接口用于字节码的转换。示例代码展示了如何创建和应用JavaAgent,同时提供了参考资料和演示项目的链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是Java Agent

Java Agent是一种特别的Java 类,能通过Java Instrumentation API实现对JVM的应用类进行拦截,并修改字节码。

Java Agent的premain方法

当JVM初始化后,首先调用Java Agent类的premain方法,接着调用main方法。

织入Java Agent类的两种场景

  • 静态agent

当我们需要把要织入的Java Agent类,随着被织入的应用类JVM一起启动时,则使用静态agent。

实现方法:

public class JavaAgent {

  /**

   * As soon as the JVM initializes, This  method will be called.

   *

   * @param agentArgs       The list of agent arguments

   * @param instrumentation The instrumentation object

   * @throws InstantiationException

   */

  public static void premain(String agentArgs, Instrumentation instrumentation) throws InstantiationException {

      InterceptingClassTransformer interceptingClassTransformer = new InterceptingClassTransformer();

      interceptingClassTransformer.init();

      instrumentation.addTransformer(interceptingClassTransformer);

  }

}
  1.  Java Agent类样例如上图。
  2. 把Java Agent类打包成一个jar文件,并在src/main/resources/META-INF/MANIFEST.MF文件中定义Premain-Class: org.example.JavaAgent。
  3. 启动命令,添加-javaagent参数,如下:
java -javaagent:<path of agent jar file> -jar <path of the packaged jar file you want to intecept>

  • 动态agent

当我们需要把Java Agent类,织入至已处于运行状态应用类JVM时,则使用动态agent。样例代码如下:

VirtualMachine vm = VirtualMachine.attach(vmPid);

vm.load(agentFilePath);

vm.detach();

ClassFileTransformer接口

ClassFileTransformer接口在java.lang.instrumentation包中, 主要作用是通过其transform方法修改载入JVM的字节码数据。

编写一个使用Java Agent 的demo

 https://github.com/XiamenGeek/skywalking-agent-demo

https://github.com/XiamenGeek/SkywalkingTest

参考来源:

Understanding Java Agents

《Apache Skywalking 实战》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值