概述
使用方法
在JDK 1.5 中只能用premain的方式在main函数之前执行,我们需要编写一个含有下面方法的Java类:
public static void premain (String agentArgs, Instrumentation inst);
public static void premain (String agentArgs);
下面来看一个Hello World的例子,首先编写代理代码如下:
package agent;
import java.lang.instrument.Instrumentation;
public class MyAgent {
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("hello world.");
}
}
在使用的时候需要将其打成jar包,创建一个manifest文件,指定代理类的位置:
Manifest-Version: 1.0
Premain-Class: agent.MyAgent
然后打成jar包:
jar cvfm agent.jar manifest.MF agent/
接下来开始使用他来做一点事情:
java -javaagent:agent.jar Test
------ output ------
hello world.
Test
----------------------------------------华丽的分割线----------------------------------------
用premain的方式有的非常大的局限:Instrumentation只能在main函数之前执行。在JDK 1.6中加入了另外一个方法:agentmain方法。通过它我们可以在main函数开始执行以后再启动自己的Instrumentation程序,在Java类中需要实现:
public static void agentmain (String agentArgs, Instrumentation inst);
public static void agentmain (String agentArgs);
此时需要修改manifest文件:
Agent-Class: agent.MyAgent
首先起来一个JVM循环执行程序,然后编写attach的代码来使用agent.jar:
public static void main(String[] args) throws Exception {
new Thread() {
public void run() {
for (;;) {
try {
VirtualMachine vm = null;
List<VirtualMachineDescriptor> list = VirtualMachine.list();
for (VirtualMachineDescriptor vmd : list) {
vm = VirtualMachine.attach(vmd);
vm.loadAgent("D:/workspace/wszt/src/agent.jar");
vm.detach();
}
} catch (Exception e) {
}
}
}
}.start();
Thread.sleep(10000);
}
这里需要用到jdk/lib/tools.jar,需要将它加入到classpath。运行之后就可以在控制台中输出"Hello World"。现在我们可以在Java应用中来使用agentMain方法做一些事情了。
----------------------------------------华丽的分割线----------------------------------------
另外有比如对本地方法的agent以及对BootClassPath/SystemClassPath的动态增补,在这里可以看到。
Instrumentation
核心的功能在ClassFileTransformer中实现:
public interface ClassFileTransformer {
byte[] transform(
ClassLoader loader,
String className,
Class<?> classBeingRedefined,
ProtectionDomain protectionDomain,
byte[]classfileBuffer
) throws IllegalClassFormatException;
}
通过transform来实现对类的行为的改造,而在Instrumentation中提供的是对ClassFileTransformer的管理与使用。
----------END----------