Java程式設計極限考驗:ClassLoader類裝載策略
個人認為,Java程式設計中極限考驗是Classloader機制的掌握和靈活運用,特別是在複雜的系統,如存在動態類裝載,Reflect,EJB,AOP等環境。
CLass.forName()
和Thread.currentThread().getContextClassLoader())
是否一樣?
在很多文章中,都認為兩者是一致的,如Java研究組織中一篇文章,被我從google搜尋到的:
http://www.javaresearch.org/article/showarticle.jsp?column=31&thread=10178
文中說"這個方法可以用Class.forName()代替",在一般簡單情況是可以替代,但實際上有時候是不能替代的。
Classloader存在下面問題:
在一個JVM中可能存在多個ClassLoader,每個ClassLoader擁有自己的NameSpace。一個ClassLoader只能擁有一個class物件型別的例項,但是不同的ClassLoader可能擁有相同的class物件例項,這時可能產生致命的問題。如ClassLoaderA,裝載了類A的型別例項A1,而ClassLoaderB,也裝載了類A的物件例項A2。邏輯上講A1=A2,但是由於A1和A2來自於不同的ClassLoader,它們實際上是完全不同的,如果A中定義了一個靜態變數c,則c在不同的ClassLoader中的值是不同的。
因此,研究JBoss的ClassLoader策略,對於更好地實現EJB元件拼裝是用好處的,因為,一個專案中可能要用其他專案的EJB元件,如何實現執行時EJB元件共享,如何實現EJB元件打包是很重要的。
為了說明ClassLoader對於複雜架構是至重關鍵,列舉開源Portal產品Exo中ServivesManager類內容。
該類是Exo利用PicoCOntainer實現功能性Service JavaBeans初始化,在將那些Service性質的JavaBeans載入到pico中時,需要使用到Classloader,
Exo專門設立一個ServiceContext類:
在ServicesManager中,有:
private ClassLoader updatedClassLoader;
它的初始值是:
Thread.currentThread().getContextClassLoader();
如果,這裡寫Class.forName 那麼簡單,那麼你頭疼去吧。
但是這樣不夠:
在addService方法中,根據加入的不同ServiceContext實現類裝載:
其實向Picocontainer中加入一個服務很簡單,上述方法的主要程式碼是處理Classloader,考慮到Classloader有巢狀關係,上述程式碼小心使用這個Service服務的父Classloader,使用父Classloader裝載服務Service。
希望有興趣者一起討論。
CLass.forName()
和Thread.currentThread().getContextClassLoader())
是否一樣?
在很多文章中,都認為兩者是一致的,如Java研究組織中一篇文章,被我從google搜尋到的:
http://www.javaresearch.org/article/showarticle.jsp?column=31&thread=10178
文中說"這個方法可以用Class.forName()代替",在一般簡單情況是可以替代,但實際上有時候是不能替代的。
Classloader存在下面問題:
在一個JVM中可能存在多個ClassLoader,每個ClassLoader擁有自己的NameSpace。一個ClassLoader只能擁有一個class物件型別的例項,但是不同的ClassLoader可能擁有相同的class物件例項,這時可能產生致命的問題。如ClassLoaderA,裝載了類A的型別例項A1,而ClassLoaderB,也裝載了類A的物件例項A2。邏輯上講A1=A2,但是由於A1和A2來自於不同的ClassLoader,它們實際上是完全不同的,如果A中定義了一個靜態變數c,則c在不同的ClassLoader中的值是不同的。
因此,研究JBoss的ClassLoader策略,對於更好地實現EJB元件拼裝是用好處的,因為,一個專案中可能要用其他專案的EJB元件,如何實現執行時EJB元件共享,如何實現EJB元件打包是很重要的。
為了說明ClassLoader對於複雜架構是至重關鍵,列舉開源Portal產品Exo中ServivesManager類內容。
該類是Exo利用PicoCOntainer實現功能性Service JavaBeans初始化,在將那些Service性質的JavaBeans載入到pico中時,需要使用到Classloader,
Exo專門設立一個ServiceContext類:
public class ServiceContext { private ClassLoader cl; //包含Classloader資訊 private Services services; public ServiceContext(ClassLoader cl, Services services) { this.cl = cl; this.services = services; } public ClassLoader getCl() { return cl; } public Services getServices() { return services; } } <p class="indent"> |
在ServicesManager中,有:
private ClassLoader updatedClassLoader;
它的初始值是:
Thread.currentThread().getContextClassLoader();
如果,這裡寫Class.forName 那麼簡單,那麼你頭疼去吧。
但是這樣不夠:
在addService方法中,根據加入的不同ServiceContext實現類裝載:
public void addService(ServiceContext context) { Services servicesToAdd = context.getServices(); String name = servicesToAdd.getName(); URLClassLoader cl = null; if(context.getCl() instanceof URLClassLoader) { cl = (URLClassLoader) context.getCl(); } else { cl = URLClassLoader.newInstance(new URL[]{}, context.getCl()); } updatedClassLoader = new URLClassLoader(cl.getURLs(), updatedClassLoader); synchronized (servicesContext) { servicesContext.put(name, context); reloadContainer(); } } |
其實向Picocontainer中加入一個服務很簡單,上述方法的主要程式碼是處理Classloader,考慮到Classloader有巢狀關係,上述程式碼小心使用這個Service服務的父Classloader,使用父Classloader裝載服務Service。
希望有興趣者一起討論。
相關文章
- 極限程式設計程式設計
- 極限程式設計思想程式設計
- 遠離極限程式設計程式設計
- Java實驗二:類程式設計實驗Java程式設計
- 極限程式設計,一次反思程式設計
- 不要陷入極限程式設計的陷阱程式設計
- 極限程式設計的“權利法案”程式設計
- 極限程式設計 vs 互動式設計 (轉)程式設計
- [翻譯]Bob大叔:反思極限程式設計程式設計
- 擁抱極限程式設計(Do do XP)程式設計
- 大型專案的XP(極限程式設計)程式設計
- 極限程式設計中的簡單設計原則程式設計
- 深入理解Java類載入器(ClassLoader)Java
- 聯想ThinkSystem伺服器,企業智慧化考驗下的極限應考伺服器
- 考點 1:數列極限概念
- ClassLoader類載入分析(一)
- C#程式設計實驗考試C#程式設計
- 極限程式設計應該在什麼時候使用?程式設計
- 動態程式設計之classloader程式設計
- 極簡設計模式-策略模式設計模式
- Java 程式碼審計 — 1. ClassLoaderJava
- 好程式設計師Java教程分享Java之包裝類與常用類程式設計師Java
- JVM之類載入器ClassLoaderJVM
- 類載入器——ClassLoader應用
- php無限級分類函式(無極限)PHP函式
- 極限程式設計 (Extreme Programming, XP) 的一些想法程式設計REM
- 好程式設計師Java分享JVM類載入機制程式設計師JavaJVM
- web前端圖片極限最佳化策略Web前端
- PHP實現無限極分類PHP
- 敏捷開發系列之旅 第二站(走近XP極限程式設計)敏捷程式設計
- 高階程式設計師考試經驗 (轉)程式設計師
- Java安全基礎之Java反射機制和ClassLoader類載入機制Java反射
- Java程式設計思想學習錄(連載之:內部類)Java程式設計
- Laravel 框架實現無限極分類Laravel框架
- java程式設計之:Unsafe類Java程式設計
- JVM類載入器ClassLoader原始碼剖析JVM原始碼
- 好程式設計師java分享Java面試寶典:類的載入過程程式設計師Java面試
- 好程式設計師Java培訓分享Java類載入的過程概述程式設計師Java