對於java中的字節碼檢測,有asm框架和bcel和javaassist庫。本地java字節碼檢測
不過,我需要做的儀器在本機代碼,因爲一些Java類已經由javaagent運行時間,例如java.lang.Thread中,java.lang.Class中,等
裝載有任何庫用於在本地代碼中檢測java類?編號: 似乎有點混亂。
我想要的是: 創建一個本地Java代理,它使用JVMTI API在使用OnClassLoad事件掛接加載它時加載類的字節碼。
對於java中的字節碼檢測,有asm框架和bcel和javaassist庫。本地java字節碼檢測
不過,我需要做的儀器在本機代碼,因爲一些Java類已經由javaagent運行時間,例如java.lang.Thread中,java.lang.Class中,等
裝載有任何庫用於在本地代碼中檢測java類?編號: 似乎有點混亂。
我想要的是: 創建一個本地Java代理,它使用JVMTI API在使用OnClassLoad事件掛接加載它時加載類的字節碼。
加載完成後,您無法更改類的字節碼。您可以確保您的工具在加載之前運行,也可以創建一個新的ClassLoader,並通過不要求父類來重新加載其中的類。但是,您不能使用那些在ClassLoader之外加載代碼的類,因爲該代碼將引用先前加載的未修改的類。
我不想在加載字節碼後改變字節碼。我想使用本地代理來更改字節碼*,而類正在加載 – pdeva
JIT會將字節碼轉換爲本機碼。如果你想產生本地代碼,你需要讓JIT執行它或者編寫通過JNI調用的本地代碼。
也許你試圖實現可以做更簡單的另一種方式。
使用OnClassLoad事件掛鉤創建本機java代理,該代理使用JVMTI apis更改加載類時的字節碼。
雖然你不需要做你想做的。爲什麼要使解決方案比需要的更復雜(並且工作的可能性更小)?
我在博士研究期間遇到了這個問題。最適合我的答案是使用java庫(我使用ASM)在單獨的JVM中執行字節碼修改。
我使用JVMTI類加載掛鉤來捕獲類文件並使用tcp連接將其傳輸到單獨的JVM。一旦在單獨的JVM中修改了類,我將其返回給JVMTI代理,該代理將其複製到VM內存中,並將指向修改的類文件的指針返回給JVM。
我發現在同一個JVM中編織類與我想要修改的系統類文件(例如java.lang.Object)不同,必須在任何類文件之前加載我太困難了需要進行編織。在找到我最終使用的獨立JVM方法之前,我沒有取得太大的成功,因此尋找了c/C++字節碼庫。
您可以使用編織器JVM的主機名/端口參數化JVMTI代理,也可以使用某種形式的發現,具體取決於您的要求。
其他幾個答案是輕微不正確或錯誤的。您可以更改已加載的類的字節碼 - 甚至是系統類。一旦一個類已經被加載,你可能不會影響它的外部簽名(添加字段/方法),但是你可以改變方法體。使用JVM分發的基本heapTracker JVMTI演示了改變java.lang.Object的行爲。
您需要解決什麼是原始問題? –
你是什麼意思的「本機代碼」? http://www.cs.ioc.ee/~ando/jbe/提供了一個工具,使您可以直接編輯java字節碼 –
@ThorbjørnRavnAndersen我想要在JavaAgent加載之前加載類似Thread和Class的類,因此它們必須在本地代理中進行檢測。 – pdeva