Java 熱更新 載入class和jar__Java

來源:互聯網
上載者:User

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到記憶體中。

參考代碼:public class ReloadClassLoader extends ClassLoader{
/**

* @param classFile class檔案
* @return
* @throws Exception
*/
public Class<?> loadClass(File classFile){
// 一般的class檔案通常都小於100k,如果現實情況超出這個範圍可以放大長度
byte bytes[] = new byte[(int) classFile.length()];
FileInputStream fis = null;
Class<?> clazz = null;
try
{
fis = new FileInputStream(classFile);
int j = 0;
while (true)
{
int i = fis.read(bytes);
if (i == -1)
break;
j += i;
}
clazz = super.defineClass(null, bytes, 0, j);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return clazz;
}
/**

* @param JarFile Jar包
* @param className 全類名
* @return 
* @throws Exception
*/
public Class<?> loadJAR(File JarFile,String className){
Class<?> cls = null;
         if (!JarFile.exists()) {
             return null;
         }
        
try {
URL url = JarFile.toURI().toURL();
URLClassLoader classLoader = new URLClassLoader(new URL[] { url }, Thread.currentThread().getContextClassLoader());
cls = classLoader.loadClass(className);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
         return cls;
}
}





相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.