楊浦做網(wǎng)站百度客服人工電話多少
概念
premain是在jvm啟動的時候類加載到虛擬機之前執(zhí)行的?
agentmain是可以在jvm啟動后類已經(jīng)加載到j(luò)vm中了,才去轉(zhuǎn)換類。 這種方式會轉(zhuǎn)換會有一些限制,比如不能增加或移除字段。
具體的做法,兩者的實際做法是差不多的:
premain
定義個靜態(tài)方法public static void premain(String args, Instrumentation inst),
在java 的啟動參數(shù)中添加 -javaagent:/jar包路徑[=agentArgs] 這樣定義了后jvm啟動時,就會去加載javaagent中指定的jar包,查找MANIFEST.MF文件中Premain-Class屬性的類,執(zhí)行premain方法。
Manifest-Version: 1.0
Can-Redefine-Classes: true
Premain-Class: com.premian.MyAgent
Can-Retransform-Classes: true
agentmain
定義個靜態(tài)方法public static void agentmain(String agentOps, Instrumentation instrumentation),
在生成jar包中MANIFEST.MF文件中需要有Agent-Class: xxx.xxx (xxx.xxx就是上面agentmain方法所在的類名)
Can-Retransform-Classes: true
Manifest-Version: 1.0
Can-Redefine-Classes: true
Agent-Class: cn.think.in.java.clazz.loader.asm.agent.AgentMainTraceAgent
Can-Retransform-Classes: true
使用下面代碼,將agent添加到指定java進程vm = VirtualMachine.attach(pid);try {vm.loadAgent("D:\\tmp\\my-java-agent-1.0-jar-with-dependencies.jar", null);} finally {vm.detach();}
?