動態程式設計之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程式設計
- 動態程式設計(DynamicProgramming)程式設計
- 好程式設計師分享MyBatis之動態SQL語句程式設計師MyBatisSQL
- 設計模式之cglib動態代理設計模式CGLib
- Android程式設計師必會技能---執行時動態生成類---之動態代理Android程式設計師
- Android程式設計師必會技能—執行時動態生成類—之動態代理Android程式設計師
- Mybatis之介面程式設計--JAVA動態代理的最佳展現MyBatis程式設計Java
- 好程式設計師Java學習路線之Spring框架之動態代理程式設計師JavaSpring框架
- Java 程式碼審計 — 1. ClassLoaderJava
- 23種設計模式之——動態代理模式設計模式
- shell程式設計之免互動程式設計
- JAVA_動態代理AOP切面程式設計Java程式設計
- Java安全之ClassLoaderJava
- php程式碼審計之——phpstorm動態除錯PHPORM除錯
- 複雜報表設計之動態報表
- 程式設計技巧之-表驅動法程式設計
- Java安全之BCEL ClassLoaderJava
- 設計模式:動態代理設計模式
- Java併發程式設計序列之執行緒狀態Java程式設計執行緒
- 設計模式之——狀態模式設計模式
- 好程式設計師大資料開發之掌握Hive的靜態分割槽與動態分割槽程式設計師大資料Hive
- 程式設計模式-表驅動程式設計程式設計設計模式
- 啟動!阿里巴巴程式設計之夏2022阿里程式設計
- Dubbo 程式設計之夏報名啟動了程式設計
- Java中的超程式設計與動態代理技術Java程式設計
- AntDB-M高效能設計之hash索引動態rehash索引
- PHP 設計模式之狀態模式PHP設計模式
- 設計模式20之狀態模式設計模式
- 設計模式之狀態模式(State)設計模式
- 程式設計思想之冪等性 | 程式設計之道程式設計
- JVM之類載入器ClassLoaderJVM
- 好程式設計師Java分享Mybatis必會的動態SQL程式設計師JavaMyBatisSQL
- .NET Core 實現動態代理做AOP(面向切面程式設計)程式設計
- Linux之shell程式設計Linux程式設計
- Spring之切面程式設計Spring程式設計
- python之超程式設計Python程式設計
- 《程式設計師的自我修養筆記之靜態連結》程式設計師筆記
- Quick-Task 動態指令碼支援框架之結構設計篇UI指令碼框架
- 動態表單後端設計後端