動態程式設計之classloader
這個周看了很多有關classloader的文章,再加上自己的一點實踐拿出來跟大家分享,如有謬誤,懇請指正。首先簡單介紹一下classloader的結構:每個構造好的類在某種意義上是由裝入它的類裝入器所“擁有”,類裝入器通常保留它們所裝入類的對映,從而當再次請求某個類時,能透過名稱找到該類,而裝載機則有可能將類儲存在快取或記憶體之中,每個類裝入器還保留對父類裝入器的引用,整個classloader結構是一個類裝入器樹,下層的裝入器由上層的裝入器裝入,而這些裝入器都使用java語言編成,既然這樣那根裝入器是被什麼裝進去的呢?我猜既然java語言都需要classloader裝進去的話那根classloader一定不是java編寫的了,可能是彙編或者c完成的(這裡沒查資料,不是很準確)。那麼關於動態載入新的類這一主題我曾經想得很簡單,覺得無非就是另起一個執行緒監視給定的目錄然後掃入目錄下的類把這些類載入進虛擬機器裡就行了,試驗了很多次這樣的想法都沒成功,最後查資料才知道原因是各個執行緒的classloader都不一樣而且不會去主動溝通,每個執行緒只能用到當前的classloader以及系統classloader也就是,裝載環境變數classpath下設定的那些類的classloader,所以另起一個執行緒所載入進來的類主執行緒根本用不成。至於要怎麼實現,可以參考IBM技術文件,也可以參考開源專案JBOSS伺服器的原始碼,我的看法是,他們的做法可以說是殊途同歸,IBM文件上採用了繼承URLClassLoader的方法,透過getSystemClassLoader()方法取得當前classloader,並把它作為父類作為引數建立自己的classloader;而JBOSS的做法更為巧妙,它將當前執行緒的classloader取得後暫時存起來,並且用給定URL建立的classloader取代當前classloader,當用完所需要路徑下的類之後再恢復當前執行緒,這樣就達到了把檢測和呼叫新類的任務分離出去給子執行緒做的一個目的,構思很是巧妙,具體實現可以參考JBOSS的原始碼,下載地址是http://prdownloads.sourceforge.net/jboss/jboss-3.0.1RC1-src.tgz?download。至於動態呼叫給與的新類中的各種函式的方法,要用到java的Reflection機制,相信各位都不陌生,可以查閱sun的載線文件
相關文章
- Java安全之Javassist動態程式設計Java程式設計
- Java動態程式設計---動態代理Java程式設計
- 動態程式設計(DynamicProgramming)程式設計
- 好程式設計師分享MyBatis之動態SQL語句程式設計師MyBatisSQL
- Mybatis之介面程式設計--JAVA動態代理的最佳展現MyBatis程式設計Java
- Android程式設計師必會技能—執行時動態生成類—之動態代理Android程式設計師
- Android程式設計師必會技能---執行時動態生成類---之動態代理Android程式設計師
- ABAP 動態程式設計-FIELD-SYMBOLS程式設計Symbol
- ABAP動態程式設計-DESCRIBE FIELD程式設計
- 23種設計模式之——動態代理模式設計模式
- Java設計模式-之代理模式(動態代理)Java設計模式
- 使用者體驗之——動態設計
- 好程式設計師Java學習路線之Spring框架之動態代理程式設計師JavaSpring框架
- Java程式設計思想之靜態技術Java程式設計
- C# 4.0中的動態型別和動態程式設計C#型別程式設計
- shell程式設計之免互動程式設計
- JAVA_動態代理AOP切面程式設計Java程式設計
- 複雜報表設計之動態報表
- Java程式設計極限考驗:ClassLoader類裝載策略Java程式設計
- android常用設計模式之代理設計模式及動態代理原理Android設計模式
- WDM驅動程式設計之設計開發篇 (轉)程式設計
- 程式設計技巧之-表驅動法程式設計
- Java 程式碼審計 — 1. ClassLoaderJava
- php程式碼審計之——phpstorm動態除錯PHPORM除錯
- 設計模式:動態代理設計模式
- Java安全之ClassLoaderJava
- 設計模式_JAVA動態代理設計模式設計模式Java
- 設計模式之——狀態模式設計模式
- 好程式設計師大資料開發之掌握Hive的靜態分割槽與動態分割槽程式設計師大資料Hive
- Java併發程式設計序列之執行緒狀態Java程式設計執行緒
- c++ 泛型程式設計 之 自動生成程式碼C++泛型程式設計
- Java安全之BCEL ClassLoaderJava
- Windows下的VC++動態連結庫程式設計WindowsC++程式設計
- WebClass實現動態WEB程式設計之理論篇 (轉)Web程式設計
- Dubbo 程式設計之夏報名啟動了程式設計
- 程式設計模式-表驅動程式設計程式設計設計模式
- AntDB-M高效能設計之hash索引動態rehash索引
- PHP 設計模式之狀態模式PHP設計模式