Java Agent初认识

1.前言

我们可能听过java的探针技术,用作在jvm加载class前后动态修改字节码或者在监听jvm运行状态等。其实都是基于实现jvm对外暴露的工具接口 Java Instrumentation API 做到的。下边我们就来学习下怎么创建一个java agent并且在jvm启动前后修改我们的类行为。

2.什么是Java Agent

一般来说,java agent只是一个特制的jar,能够利用JVM提供的Instrumentation API来更改JVM中加载的现有字节码。要想创建一个java agent,必须定义两种方法,如下所示:

  • premain 将在JVM启动时使用-javaagent参数静态加载代理
  • agentmain 使用Java Attach API将代理动态加载到JVM中,但是注意JVM的实现(例如Oracle,OpenJDK等)可以提供一种动态启动代理的机制,但这不是必需的。

3.加载Java Agent的方式

有两种方式去加载一个定义好的java agent,静态加载和动态加载:

(1) 静态加载 使用premain通过-javaagent选项加载代理
java -javaagent:agent.jar -jar application.jar
注意:-javaagent参数要在-jar参数前面
(2)动态加载 使用agentmain通过Java Attach API将代理加载到运行中的JVM中
VirtualMachine jvm = VirtualMachine.attach(jvmPid);
jvm.loadAgent(agentJarPath);
jvm.detach();

4.最常用的Java Instrumentation API

  • addTransformer – adds a transformer to the instrumentation engine
  • getAllLoadedClasses – returns an array of all classes currently loaded by the JVM
  • retransformClasses – facilitates the instrumentation of already loaded classes by -adding byte-code
  • removeTransformer – unregisters the supplied transformer
  • redefineClasses – redefine the supplied set of classes using the supplied class files, meaning that the class will be fully replaced, not modified as with
    retransformClasses

5.MANIFEST.MF文件

如果需要java启动后识别agent,需要在MANIFEST.MF文件中定义Agent-Class(动态加载)或者Premain-Class(静态加载)

你可能感兴趣的:(Java Agent初认识)