2011-07-25 64 views
1

我正在嘗試創建一個工具,可以捕獲由java程序所做的所有讀取和寫入操作。另外,我想知道訪問/修改什麼對象的哪些字段。如何捕獲Java程序中的讀寫操作?

我目前看: -

1)的java.lang.instrument 我不能做很多這一點。我無法理解如何編寫能夠訪問正在運行的程序的代理,並在不同的對象/字段和相關的任何內容上創建監視。如果您對此有任何想法或信息,我將不勝感激。

2)JVMTI 我看着JVMTI,並試圖建立一個JVMTI工具,但我想通了,得到的對象,我需要的JVMTI_EVENT_OBJECT_ALLOC是一個潛在的能力。但是,我認爲,事實並非如此。此外,我讀到,這個事件不叫命令。因此,目前,這似乎也不適用。

所以,我想知道你們是否知道有什麼辦法可以做我想做的事情,或者使用上面提到的方法或者其他你可能知道的技術/工具?

注意:我無權訪問應用程序的源代碼。所有的,我有類文件。

+0

類文件是亂碼還是可以反編譯它們? – Matt

+0

嗨馬特,我有java應用程序作爲單個jar文件。 – Ankit

+0

我的問題主要針對:你想解決一般問題還是僅僅針對你的特定jar文件? – Matt

回答

1

它很容易與ASM lib做。創建一個新的Class Loader,它在加載它們並用它加載目標類之前對所有類進行檢測。創建一個新的MethodAdapter並覆蓋visitFieldInsn方法。然後查找PUTFIELD,PUTSTATIC,GETFIELDGETSTATIC操作碼。雖然這看起來很可怕(因爲我的解釋很可能是胡言亂語),但事實上它很容易。只需下載ASM手冊,即可知道如何做到這一點。

編輯:我忘了告訴爲了能夠攔截JDK代碼完成的讀寫操作,您必須對這些類進行檢測,將它們保存到文件中,並使用修改後的引導類路徑運行JVM,通過命令行參數-Xbootclasspath(java。*和其他一些軟件包;我相信至少sun。*和javax。*也需要這個)。

這可能也適用於AspectJ ...但我不確定。

相關問題