怎樣攔截classloader實現類方法截獲

leadyu發表於2007-04-23
我目前正在開發的一個元件想實現一個功能: 就是透過配置檔案配置類名,就能夠攔截該類所有方法的呼叫,而該類可能沒有實現任何介面,並且這個過程對於系統程式是透明的,我想在虛擬機器這層解決這個問題,對於元件的部署都是非常有幫助的.

目前我的想法就是透過攔截classloader,或者實現自己的classloader,另外透過修改原class的字解碼實現攔截方法。但是遇到2個難題:
1)classloader的攔截似乎並不那麼聽話,我是透過Thread.setContextClassLoader()來設定自己的classloader,但是似乎對於下面的程式,並不一定就會採用我設定的classloader工作,在多個容器和JDK版本下試過,行為有點不一樣,而SUN在這方面的資料又非常匱乏。
2)字解碼修改,往往我需要代理的類在我的元件執行時已經被上層classloader載入,這時試圖修改該類的字解碼,會引起JVM報錯,比如重複載入之類的錯誤。

由於資料非常匱乏,所以,非常希望有這方面經驗的人,能夠給大家講解一下虛擬機器載入類的時序,已經類生存的週期,名稱空間,以及安全控制等問題,當然最重要的是告訴我怎麼實現我想要的功能,呵呵。

相關文章