javaagent是一種能夠在不影響正常編譯的情況下货矮,修改字節(jié)碼。java作為一種強類型的語言斯够,不通過編譯就不能能夠進行jar包的生成囚玫。而有了javaagent技術(shù),就可以在字節(jié)碼這個層面對類和方法進行修改读规。
演示代碼
public class FirstAgent implements ClassFileTransformer {
public final String injectedClassName = "com.xueyou.agentdemo.App";
public final String methodName = "hello";
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
className = className.replace("/", ".");
if (className.equals(injectedClassName)) {
CtClass ctclass = null;
try {
ctclass = ClassPool.getDefault().get(className);// 使用全稱,用于取得字節(jié)碼類<使用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();
}
}
return null;
}
}
public class App {
public static void premain(String agentOps, Instrumentation inst) {
System.out.println("=========premain方法執(zhí)行========");
System.out.println(agentOps);
// 添加Transformer
inst.addTransformer(new FirstAgent());
}
}
運行命令行
java -javaagent:XXX.jar ddd.jar