使用-javaagent 参数用户可以在执行main函数前执行一些其他逻辑(类似aop),甚至可以动态的修改替换类中代码。
举例说明:我们想把如下程序中的6改为7
- public class HelloWorld {
- public static void main(String arg[]) {
- System.out.println("The number six is 6");
- }
- }
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.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);
- }
- }
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