黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學(xué)習(xí)攻略 Java學(xué)習(xí) Java熱部署的原理

Java熱部署的原理

更新時間:2022-07-07 12:12:33 來源:動力節(jié)點 瀏覽3351次

動力節(jié)點小編來為大家介紹Java熱部署的原理。

1.什么是熱部署?

對于Java應(yīng)用來說,熱部署就是在運(yùn)行時更新Java類文件。

2.熱部署有什么用?

您可以在不重新啟動應(yīng)用程序的情況下更新應(yīng)用程序。比如電腦不用重啟就可以更換U盤。

OSGI 也因其模塊化和熱部署而廣受歡迎。

3.熱部署的原理是什么?

要知道熱部署的原理,就必須了解java類的加載過程。一個java類文件到虛擬機(jī)中的一個對象必須經(jīng)過以下過程。

通過java編譯器,將java文件編譯成類字節(jié)碼,類加載器讀取類字節(jié)碼,然后將類轉(zhuǎn)化為實例,可以為實例newInstance生成一個對象。

ClassLoader 的作用是將類字節(jié)碼轉(zhuǎn)換為類的實例。

在 Java 應(yīng)用程序中,所有實例都由類加載器加載。

一般在系統(tǒng)中,類的加載是由系統(tǒng)自帶的類加載器完成的,對于同名的java類(如com.csiar.soc.HelloWorld),只能加載一次并且無法加載。卸載。

這時,問題來了。如果我們要卸載java類并替換較新版本的java類,我們應(yīng)該怎么做呢?

由于在類加載器中,java類只能加載一次,不能卸載。是否可以直接更改類加載器?答案是肯定的,我們可以自定義類加載器,重寫ClassLoader的findClass方法。實現(xiàn)熱部署可以分為以下三個步驟:

(1)銷毀自定義的ClassLoader

(2)更新類文件

(3)新建一個ClassLoader來加載更新的類文件。

示例代碼如下:

 package com.csair.soc.hotswap; 
 import java.io.IOException;
 import java.io.InputStream;
/**
 * Custom class loader, and override the findClass method
 */
 public class MyClassLoader extends ClassLoader{
 @Override
 public Class<?> findClass(String name) throws ClassNotFoundException{
 try{
 String fileName = name.substring(name.lastIndexOf("." )+1) + ".class";
 InputStream is = this.getClass().getResourceAsStream(fileName);
 byte[] b = new byte[is.available()];
 is.read(b);
 return defineClass(name, b, 0, b. length);
} catch(IOException e){
 throw new ClassNotFoundException(name);
}
}
 }

需要更新的類文件:

 package com.csair.soc.hotswap;
 public class HelloWorld {
       public void say(){
            System. out.println( "Hello World V1");
      }
 }

在項目根目錄下,生成V2版本的HelloWorld.class,內(nèi)容如下。

package com.csair.soc.hotswap;
 public class HelloWorld {
       public void say(){
            System. out.println( "Hello World V2");
      }
 }

測試主程序

package com.csair.soc.hotswap; 
 import java.io.File;
 import java.lang.reflect.Method; 
 public class Hotswap {
 public static void main(String[] args) throws Exception {
 loadHelloWorld();
//Recycle resources and release the HelloWorld.class file so that it can be replaced
 System. gc();
 Thread. sleep(1000);//Waiting for resources to be recycled
 File fileV2 = new File( "HelloWorld.class");
 File fileV1 = new File(
 "bin\\com\\csair\\soc\\hotswap\\HelloWorld.class" );
 fileV1.delete();//Delete the V1 version
 fileV2.renameTo(fileV1);//Update V2 version
 System. out.println( "Update success!");
 loadHelloWorld();
} 
 public static void loadHelloWorld() throws Exception {
 MyClassLoader myLoader = new MyClassLoader();//Custom class loader
 Class<?> class1 = myLoader
 .findClass( "com.csair.soc.hotswap.HelloWorld");//Class instance
 Object obj1 = class1.newInstance();//Generate a new object
 Method method = class1.getMethod( "say");
 method.invoke(obj1);//Execute method say
 System. out.println(obj1.getClass());//Object
 System. out.println(obj1.getClass().getClassLoader());//Object class loader
}
}

輸出結(jié)果:

你好世界V1
com.csair.soc.hotswap.HelloWorld 類
com.csair.soc.hotswap.MyClassLoader@bfc8e0
更新成功!
你好世界V2
com.csair.soc.hotswap.HelloWorld 類
com.csair.soc.hotswap.MyClassLoader@860d49

根據(jù)結(jié)果??,我們可以看到 HelloWorld 類更新成功,無需重新啟動應(yīng)用程序。如果大家想了解更多相關(guān)知識,可以關(guān)注一下動力節(jié)點的Java在線學(xué)習(xí),里面的課程內(nèi)容從入門到精通,細(xì)致全面,很適合0基礎(chǔ)的小伙伴學(xué)習(xí),希望對大家能夠有所幫助。

提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 极品美女一级毛片 | 久草新视频 | 亚洲好色网 | 2017天天爽夜夜爽精品视频 | 国产精品黄在线观看免费网站 | 免费国产不卡午夜福在线 | 日日摸人人拍人人澡 | 色香视频在线 | 黄色搞基网站 | 深夜a级毛片免费视频 | 欧洲乱码专区一区二区三区四区 | 色综久久天天综合绕视看 | 国产亚洲精品激情都市 | 亚洲va| 成人午夜视频在线 | 美女一级毛片毛片在线播放 | 黄色免费高清视频 | 成人精品网 | xxx欧美hd| 妞干网中文字幕 | 亚洲综合区小说区激情区噜噜 | 成人小视频网 | 中国一级全黄的免费观看 | 国产欧美日本亚洲精品一4区 | 欧洲一级视频 | 波多在线视频 | 国产伦精品一区二区三区 | 丁香综合激情 | 欧美成人一区二区三区在线视频 | 91日本| 全免费a级毛片免费看视频免 | 99精品影视| 欧美特黄视频 | 亚洲精品视频专区 | 亚洲国产精 | 污视频网页 | 色综合天天综合网站中国 | 69黄在线看片免费视频 | 日韩毛片在线视频 | 看免费黄色大片 | 一个人看的免费视频www中国 |