是否有可能在不修改代碼的情況下偵聽實例的方法執行或類的所有實例? 喜歡的東西:有沒有辦法監聽另一個類的方法執行?
someInstance.addMethodExecutionListener('methodName', handler);
SomeClass.addMethodExecutionListener('methodName', handler);
這將是用於日誌記錄...
是否有可能在不修改代碼的情況下偵聽實例的方法執行或類的所有實例? 喜歡的東西:有沒有辦法監聽另一個類的方法執行?
someInstance.addMethodExecutionListener('methodName', handler);
SomeClass.addMethodExecutionListener('methodName', handler);
這將是用於日誌記錄...
什麼你問的是,你可以用面向方面的編程做一小部分。它在普通Java及其實現中不受支持,但它是AspectJ的核心原因。
根據環境的不同,您可以使用不同的技術。 Spring提供Aspects,您可以綁定到某些事件(例如方法執行)。
如果您處於Java EE容器託管環境中,則可以使用EJB的Interceptors或Web服務的SoapHandlers。
一種方法是使用工具API JVMTI(替換獨立的調試和性能分析API)。
否則,您可以重寫類文件以在方法代碼之前插入代碼。這並不容易。 ASM適用於較低級別的字節碼操作,但您可能需要使用某個庫(或自己編寫)或可能使用某些「方面」工具。
在加載之前,或者在運行時在命令行上使用instrumentation API和-javaagent:
,可以輕鬆地將「字節碼」重寫爲「在光盤上」。
那麼你想要什麼。每次執行'methodName()'函數時都需要通知嗎? –
的確如此,並且不需要修改Class代碼。 –