使用-javaagent 参数用户可以在执行main函数前执行一些其他逻辑(类似aop),甚至可以动态的修改替换类中代码。
举例说明:我们想把如下程序中的6改为7
public class HelloWorld {
public static void main(String arg[]) {
System.out.println("The number six is 6");
}
}
import java.lang.instrument.Instrumentation;
public class MySimpleAgent {
public static void premain(String agentArgs,Instrumentation inst) {
inst.addTransformer(new MySimpleTransformer());
}
}
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;
public class MySimpleTransformer implements ClassFileTransformer {
public byte[] transform(ClassLoader classloader,
String classname,
Class redefinedclass,
ProtectionDomain protectiondomain,
byte b[]) throws IllegalClassFormatException {
if(!classname.endsWith("HelloWorld"))
return(null);
String line = "";
for(int i=0; i < b.length;i++){
line += Byte.toString(b[i]) + " ";
if(line.length() > 60) {
System.out.println(line);
line = "";
}
if(b[i] == (byte)'6')
b[i] = (byte)'7';
}
System.out.println(line);
System.out.println("The number of bytes in HelloWorld: " + b.length);
return(b);
}
}
javac *.java 2>&1 | more
jar -cfm MyAgent.jar agentmantext MySimpleAgent.class MySimpleTransformer.class
其中的agentmantext的内容如下:
Premain-Class: MySimpleAgent
而运行方法则如下:
java -javaagent:MyAgent.jar HelloWorld