package com.mergades.apm.javaagent;
public class HelloAgentTest {
public static void main(String[] args) {
System.err.println("TestHelloAgent main 方法");
}
}
单元测试run config引入自己的agent jar,直接运行,获取agent植入的输出结果。
装载成功 方法 premain 参数:name=lisi&age=30
TestHelloAgent main 方法
Agentjar和普通jar的区别
运行时jar
agent
入口方法名称
Main
premain
Maninfe.MF 主要参数
Main-class
Premain-Class
启动参数
java -jar xxx.jar
-javaagent:xxx.jar
执行顺序
先
是否独立启动
是
否
agent 代码植入
执行方法前加入代码,执行方法后加入代码
package com.mergades.apm.classpool;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;
public class FirstAgent implements ClassFileTransformer {
public final String injectedClassName = "com.mergades.apm.javaagent.HelloAgentTest";
public final String methodName = "hello";
@Override
public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
className = className.replace("/", ".");
if (className.equals(injectedClassName)) {
CtClass ctclass;
Long start = System.nanoTime();
try {
ctclass = ClassPool.getDefault().get(className);// 使用全称,用于取得字节码类<使用javassist>
CtMethod ctmethod = ctclass.getDeclaredMethod(methodName);// 得到这方法实例
ctmethod.insertBefore("System.out.println(11111111);");
return ctclass.toBytecode();
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
} finally {
System.out.println("className took:" + (System.nanoTime() - start));
}
}
return null;
}
}
Create the Google Play Account
Having a Google account, pay 25$, then you get your google developer account.
References:
http://developer.android.com/distribute/googleplay/start.html
https://p