tomcat類加載器測試

tomcat的類加載器
WebappClassLoader context: /oalocal delegate: false
repositories: /WEB-INF/classes/ ----------> Parent Classloader: org.apache.catalina.loader.StandardClassLoader@c44b88

Thread.currentThread().getContextClassLoader():輸出  WebappClassLoader
Thread.currentThread().getContextClassLoader().getSystemClassLoader(): 輸出 sun.misc.Launcher$AppClassLoader@1cde100

AppClassLoader
        | StandardClassLoader
                  |  WebappClassLoader

System.getProperty("java.class.path")

打印出某個類加載器的所有JAR包,以下是打印出WEB-INF/lib下的所有包  

線程上下文加載器,舉了JNDI的例子。逆着正常的加載來做。上下文類加載器要比當前類加載器更適合於框架編程,而當前類加載器則更適合於業務邏輯編程。


    out.println(Thread.currentThread().getContextClassLoader());//打印出WEB-INF/lib下的所有包
    try {
            java.net.URL[] extURLs = ((java.net.URLClassLoader)Thread.currentThread().getContextClassLoader()).getURLs();
            for (int i = 0; i < extURLs.length; i++) {
                     out.println(extURLs[i]);
              }
       } catch (Exception e) {
     }
     out.println("--------------------------<br><br>");
     //org.apache.catalina.loader.StandardClassLoader  打印出tomcat/lib下的所有包
     out.println(Thread.currentThread().getContextClassLoader().getParent());
         try {
            java.net.URL[] extURLs = ((java.net.URLClassLoader)Thread.currentThread().getContextClassLoader().getParent()).getURLs();
            for (int i = 0; i < extURLs.length; i++) {
                     out.println(extURLs[i]);
              }
       } catch (Exception e) {
     }
     out.println("--------------------------<br><br>");
     //sun.misc.Launcher$AppClassLoader 打印出jdk下的所有包/D:/apache-tomcat-6.0.30/bin/bootstrap.jar file:/D:/jdk1.6.0_21/lib/tools.jar
     out.println(Thread.currentThread().getContextClassLoader().getParent().getParent());
         try {
            java.net.URL[] extURLs = ((java.net.URLClassLoader)Thread.currentThread().getContextClassLoader().getParent().getParent()).getURLs();
            for (int i = 0; i < extURLs.length; i++) {
                     out.println(extURLs[i]);
              }
       } catch (Exception e) {
     }
     

2.1    JVM三種預定義類型類加載器

我們首先看一下JVM預定義的三種類型類加載器,當一個 JVM 啓動的時候,Java 缺省開始使用如下三種類型類裝入器:

啓動(Bootstrap)類加載器:引導類裝入器是用本地代碼實現的類裝入器,它負責將 <Java_Runtime_Home>/lib 下面的類庫加載到內存中。由於引導類加載器涉及到虛擬機本地實現細節,開發者無法直接獲取到啓動類加載器的引用,所以不允許直接通過引用進行操作。

標準擴展(Extension)類加載器:擴展類加載器是由 Sun 的 ExtClassLoader(sun.misc.Launcher$ExtClassLoader) 實現的。它負責將 < Java_Runtime_Home >/lib/ext 或者由系統變量 java.ext.dir 指定位置中的類庫加載到內存中。開發者可以直接使用標準擴展類加載器。

系統(System)類加載器:系統類加載器是由 Sun 的 AppClassLoader(sun.misc.Launcher$AppClassLoader)實現的。它負責將系統類路徑(CLASSPATH)中指定的類庫加載到內存中。開發者可以直接使用系統類加載器。

除了以上列舉的三種類加載器,還有一種比較特殊的類型就是線程上下文類加載器,這個將在後面單獨介紹。

 Thread.currentThread().getContextClassLoader()
 
 參數構建完畢之後,開始設置類加載器
 Thread.currentThread().setContextClassLoader(apiObjectFactory.getClassLoaderInstance(FileHelper.getFolder(method)));
 
 也就是說,如果不設置ContextClassLoader的話,用的就是系統的類加載器。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章