URLClassLoader使用方法和實例

1、首先了解下Java幾個加載器的基本原理:

         Java 中的類加載器大致可以分成兩類,一類是系統提供的,另外一類則是由 Java 應用開發人員編寫的。系統提供的類加載器主要有下面三個: 
     引導類加載器(bootstrap class loader):它用來加載 Java 的核心庫,是用原生代碼來實現的,並不繼承自 java.lang.ClassLoader。 
     擴展類加載器(extensions class loader):它用來加載 Java 的擴展庫。Java 虛擬機的實現會提供一個擴展庫目錄。該類加載器在此目錄裏面查找並加載 Java 類。 
     系統類加載器(system class loader):它根據 Java 應用的類路徑(CLASSPATH)來加載 Java 類。一般來說,Java 應用的類都是由它來完成加載的。可以通過 ClassLoader.getSystemClassLoader() 來獲取它。

     除了系統提供的類加載器以外,開發人員可以通過繼承 java.lang.ClassLoader 類的方式實現自己的類加載器,以滿足一些特殊的需求。 

      我們平時程序執行的時候在類加載器中尋找類的結構的順序是:引導類加載器-》 擴展類加載器-》系統類加載器-》我們自定義的一些類加載器,每個類加載器都有自己的空間,同一個加載器裏面的類的二進制名字必須是唯一的,當然同一個類也可以存在不同的加載器內存區域裏面,不過我們尋找類的時候是按順序找的,一但找的也就不會繼續往下找了,最終也沒找到就會報類不存在異常。 
    我們如果想動態加載類的話就要仿照我們用的服務器如tomcat和weblogic之類的,他們的開發模式也就是把所有的類都加載到自身的類加載器中,當文件被替換的時候他們就重新加載新的class到內存裏面去,從而實現了類的動態加載。

2、使用概要:

  File   file   =   new   File(jar文件全路徑);   
  URL   url   =   file.toURI().toURL(); 
  URLClassLoader   loader   =   new   URLClassLoader(new   URL[]   {   url   });   
  Class   tidyClazz   =   loader.loadClass(所需class的含包名的全名);  

詳細說明:

我們知道,Java利用ClassLoader將類載入內存,並且在同一應用中,可以有很多個ClassLoader,通過委派機制,把裝載的任務傳遞給上級的裝載器的,依次類推,直到啓動類裝載器(沒有上級類裝載器)。如果啓動類裝載器能夠裝載這個類,那麼它會首先裝載。如果不能,則往下傳遞。當父類爲null時,JVM內置的類(稱爲:bootstrap class loader)就會充當父類。想想眼下的越來越多用XML文件做配置文件或者是描述符、部署符。其實這些通過XML文檔描述的配置信息最終都要變成Java類,實都是通過ClassLoader來完成的。URLClassLoader是ClassLoader的子類,它用於從指向 JAR 文件和目錄的 URL 的搜索路徑加載類和資源。也就是說,通過URLClassLoader就可以加載指定jar中的class到內存中。

下面來看一個例子,在該例子中,我們要完成的工作是利用URLClassLoader加載jar並運行其中的類的某個方法。

首先我們定義一個接口,使所有繼承它的類都必須實現action方法,如下:

package uRLClassLoaderTest;

public interface ActionInterface {
public String action();
}

完成後生成class文件,再將其打包爲testInterface.jar文件。

接下來新建一工程,爲了編譯通過,引入之前打好的testInterface.jar包。並創建TestAction類,使它實現ActionInterface接口。如下:

package uRLClassLoaderTest;
import uRLClassLoaderTest.ActionInterface;
public class TestAction implements ActionInterface{
    public String action()
    {
     return "this ActionTest class";
    }
}

同樣,完成後生成class文件,再將其打包爲test.jar,放在c盤根目錄下。下面要做的就是利用URLClassLoader加載並運行TestAction的action方法,並將返回的值打印在控制檯上。

新建一工程,引入testInterface.jar包。並創建一可執行類(main方法),在其中加入如下代碼:

package test;
import java.NET.*;
import java.io.*;
import actionInterface.ActionInterface;
public class ClassLoaderTest {
public static void main(String args[])
{
   try
   {  
    File file=new File("rtest.txt");
    BufferedReader in=new BufferedReader(new FileReader(file));
     String s=new String();
       while((s=in.readLine())!=null)
       {      

    URL url=new URL(s);

    s=null;

    URL url1=new URL("file:c:/test1.jar");

    URLClassLoader myClassLoader=new URLClassLoader(new URL[]{url},Thread.currentThread().getContextClassLoader());

    Class myClass=myClassLoader.loadClass("actionImplement.TestAction");

       ActionInterface action=(ActionInterface)myClass.newInstance();

    String str=action.action();

    System.out.println(str);

    URLClassLoader myClassLoader1=new URLClassLoader(new URL[]{url1},Thread.currentThread().getContextClassLoader());

    Class myClass1=myClassLoader1.loadClass("actionImplement.TestAction");

    ActionInterface action1=(ActionInterface)myClass1.newInstance();

    String str1=action1.action();

    System.out.println(str1);

   }
   }
   catch(Exception e)
   {
    e.printStackTrace();
   }
}

}
該代碼先在該工程下建立一個文件,用來存儲需要加載的jar的路徑,實現時,讀取一條路徑,加載一個

官網說明:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/

強烈推薦參考論壇:http://bbs.csdn.net/topics/210030578

                     博客:http://www.iteye.com/topic/1113190   http://www.oschina.net/code/snippet_96742_5587

                                                   http://zheng12tian.iteye.com/blog/1495037

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章