摘要:簡介是命令的一個參數。參數可以用于指定一個包,并且對該包有個要求這個包的文件必須指定項。重點就在方法,也就是我們今天的標題。和類加載器比較類加載器也可以實現運行時修改代碼。使用能讓修改字節碼這個動作化于無形,對業務透明,減少侵入性。
簡介
java agent是java命令的一個參數。參數 javaagent 可以用于指定一個 jar 包,并且對該 java 包有2個要求:
這個 jar 包的MANIFEST.MF 文件必須指定 Premain-Class 項。
Premain-Class 指定的那個類必須實現 premain()方法。
重點就在 premain 方法,也就是我們今天的標題。從字面上理解,就是運行在 main 函數之前的的類。當Java 虛擬機啟動時,在執行 main 函數之前,JVM 會先運行 -javaagent 所指定 jar 包內 Premain-Class 這個類的 premain 方法,其中,該方法可以簽名如下:
1.public static void premain(String agentArgs, Instrumentation inst)
2.public static void premain(String agentArgs)
JVM 會優先加載 1 簽名的方法,加載成功忽略 2,如果1 沒有,加載 2 方法。這個邏輯在sun.instrument.InstrumentationImpl 類中:
如何使用1 首先定義一個 MANIFEST.MF 文件:
Manifest-Version: 1.0 Can-Redefine-Classes: true Can-Retransform-Classes: true Premain-Class: cn.think.in.java.clazz.loader.asm.agent.PreMainTraceAgent
創建一個Premain-Class 指定的類,類中包含 premain 方法:
public class Main { public static void premain(String agentArgs, Instrumentation inst) { System.out.println("agentArgs : " + agentArgs); inst.addTransformer(new ClassFileTransformer() { @Override public byte[] transform(ClassLoader loader, String className, Class> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { System.out.println("premain load Class :" + className); return classfileBuffer; } }, true); } }
將 premain 的類和 MANIFEST.MF 文件打成 jar 包 .
使用 IDEA 的 build ,當然你也可以使用 maven
再簡單創建一個test類
public class AccountMain {
public static void main(String[] args) throws ClassNotFoundException, InterruptedException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { System.out.println("11111111111"); }
}
使用參數 -javaagent:jar包名 啟動要代理的方法。
類加載器也可以實現運行時修改代碼。但是對代碼的侵入性很高。使用 java agent 能讓修改字節碼這個動作化于無形,對業務透明,減少侵入性。
agent的缺點需要設置參數javaagent
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76703.html
摘要:左邊側邊欄分為三個組,分別為監控數據,事件和報告。從接到請求到響應處理完成的過程為稱為一次事務。針對應用,還提供性能監控數據,包括內存使用,線程數等等。 New Relic性能監控(二)應用監控APM 2018-04-12 瑯琊書生本系列文章基于公司使用New Relic的經驗,鑒于國內較少有這方面的文章,因此把我工作中了解到的知識分享給大家,希望可以給需要的朋友帶來幫助。 上期文章...
摘要:注入機制作為工作的基礎,也為無侵入捕獲應用數據提供可能。代碼注入機制結合和技術,在應用字節碼加載到之前進行字節碼改寫。當然,修改字節碼文件流的動作是在中進行的。 UAVStack的中間件增強框架專題(MOF)】為大家詳細講述UAV中的MOF Agent是如何借助javaagent(premain)和javaassist技術在對應用無侵入的前提下完成數據捕獲的。歡迎繼續關注UAVStac...
摘要:最黑科技的玩法就是字節碼編程,也就是動態修改或是動態生成字節碼。使用字節碼編程可以玩出很多高級玩法,其中最高級的玩法是在程序運行時進行字節碼修改和代碼注入。 showImg(https://segmentfault.com/img/bVbkqqg?w=1142&h=640);這個是我訂閱 陳皓老師在極客上的專欄《左耳聽風》,我貼出來是為了自己以后方便學習和記憶,同時也分享給你們一起學習...
摘要:什么是字節碼程序通過編譯之后生成文件就是字節碼集合正是有這樣一種中間碼字節碼,使得等函數語言只用實現一個編譯器即可運行在上。 什么是字節碼? java程序通過javac編譯之后生成文件.class就是字節碼集合,正是有這樣一種中間碼(字節碼),使得scala/groovy/clojure等函數語言只用實現一個編譯器即可運行在JVM上。看看一段簡單代碼。 public long ...
閱讀 1508·2023-04-26 00:25
閱讀 906·2021-09-27 13:36
閱讀 930·2019-08-30 14:14
閱讀 2172·2019-08-29 17:10
閱讀 1006·2019-08-29 15:09
閱讀 1942·2019-08-28 18:21
閱讀 962·2019-08-26 13:27
閱讀 971·2019-08-26 10:58