日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解Java類動態加載和熱替換

瀏覽:23日期:2022-08-12 14:43:36
目錄前言1. Java的類加載器和雙親委派模型1.1 Java類加載器1.2 雙親委派模型2. Java的類動態加載和卸載2.1 Java類的卸載2.2 自定義類加載器2.3 動態卸載存在的問題3. Java類的熱替換前言

最近,遇到了兩個和Java類的加載和卸載相關的問題:

1) 是一道關于Java的判斷題:一個類被首次加載后,會長期留駐JVM,直到JVM退出。這個說法,是不是正確的?

2) 在開發的一個集成平臺中,需要集成類似接口的多種工具,并且工具可能會有新增,同時在不同的環境部署會有裁剪(例如對外提供服務的應用,不能提供特定的采購的工具),如何才能更好地實現?

針對上面的第2點,我們采用Java插件化開發實現。上面的兩個問題,都和Java的類加載和熱替換機制有關。

1. Java的類加載器和雙親委派模型1.1 Java類加載器

類加載器,顧名思義,就是用來實現類的加載操作。每個類加載器都有一個獨立的類名稱空間,就是說每個由該類加載器加載的類,都在自己的類名稱空間,如果要比較兩個類是否“相等”,首先這兩個類必須在相同的類命名空間,即由相同的類加載器加載(即對于任何一個類,都必須由該類本身和加載它的類加載器一起確定其在JVM中的唯一性),不是同一個類加載器加載的類,不會相等。

在Java中,主要有如下的類加載器:

詳解Java類動態加載和熱替換

下面,簡單介紹上面這幾種類加載器:

啟動類加載器(Bootstrap Class Loader):這個類使用C++開發(所有的類加載器中,唯一使用C++開發的類加載器),用來加載<JAVA_HOME>/lib目錄中jar和tools.jar或者使用 -Xbootclasspath 參數指定的類。 擴展類加載器(Extension Class Loader):定義為misc.Launcher$ExtClassLoader,用來加載<JAVA_HOME>/lib/ext目錄或者使用java.ext.dir指定的類。 應用程序類加載器(Application Class Loader):定義為misc.Launcher$AppClassLoader,用來加載用戶類路徑下面(classpath)下面所有的類,一般情況下,該類是應用程序默認的類加載器。 用戶自定義類加載器(User Class Loader):用戶自定義類加載器,一般沒有必要,后面我們會專門來一部分介紹該類型的類加載器。1.2 雙親委派模型

雙親委派模型,是從 Java1.2 開始引入的一種類加載器模式,在Java中,類的加載操作通過java.lang.ClassLoader中的loadClass()方法完成,咱們首先看看該方法的實現(直接從Java源碼中撈出來的):

protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException {synchronized (getClassLoadingLock(name)) { // First, check if the class has already been loaded Class<?> c = findLoadedClass(name); if (c == null) {long t0 = System.nanoTime();try { if (parent != null) {c = parent.loadClass(name, false); } else {c = findBootstrapClassOrNull(name); }} catch (ClassNotFoundException e) { // ClassNotFoundException thrown if class not found // from the non-null parent class loader}if (c == null) { // If still not found, then invoke findClass in order // to find the class. long t1 = System.nanoTime(); c = findClass(name); // this is the defining class loader; record the stats sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0); sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1); sun.misc.PerfCounter.getFindClasses().increment();} } if (resolve) {resolveClass(c); } return c;} }

我們結合上面的注釋,來解釋下雙親委派模型的內容:

1) 接收到一個類加載請求后,首先判斷該類是否有加載,如果已經加載,則直接返回;

2) 如果尚未加載,首先獲取父類加載器,如果可以獲取父類加載器,則調用父類的loadClass()方法來加載該類,如果無法獲取父類加載器,則調用啟動器加載器來加載該類;

3) 判斷該類是否被父類加載器或者啟動類加載器加載,如果已經加載完成則返回,如果未成功加載,則自己嘗試來加載該類。

上面的描述,說明了loadClass()方法的實現,我們進一步對上面的步驟進行解釋:

因為類加載器首先調父類加載器來進行加載,從loadClass()方法的實現,我們知道父類加載器會嘗試調自己的父類加載器,直到啟動類加載器,所以,任何一個類的加載,都會最終委托到啟動類加載器來首先加載; 在前面有進行介紹,啟動類加載器、擴展類加載器、應用程序類加載器,都有自己加載的類的范圍,例如啟動類加載器只加載JDK核心庫,因此并不是父類加載器就可以都加載成功,父類加載器無法加載(一般如上面代碼,拋出來ClassNotFoundException),此時會由自己加載。

最后??亂幌攏?俳?幸幌倫芙幔?/p>

雙親委派模型:如果一個類加載器收到類加載請求,會首先把加載請求委派給父類加載器完成,每個層次的類加載器都是這樣,最終所有的加載請求都傳動到最根的啟動類加載器來完成,如果父類加載器無法完成該加載請求(即自己加載的范圍內找不到該類),子類加載器才會嘗試自己加載。

這樣的雙親委派模型有個好處:就是所有的類都盡可能由頂層的類加載器加載,保證了加載的類的唯一性,如果每個類都隨機由不同的類加載器加載,則類的實現關系無法保證,對于保證Java程序的穩定運行意義重大。

2. Java的類動態加載和卸載2.1 Java類的卸載

在Java中,每個類都有相應的Class Loader,同樣的,每個實例對象也會有相應的類,當滿足如下三個條件時,JVM就會卸載這個類:

1) 該類所有實例對象不可達

2) 該類的Class對象不可達

3) 該類的Class Loader不可達

那么,上面示例對象、Class對象和類的Class Loader直接是什么關系呢?

在類加載器的內部實現中,用一個Java集合來存放所加載類的引用。而一個Class對象總是會引用它的類加載器,調用Class對象的getClassLoader()方法,就能獲得它的類加載器。所以,Class實例和加載它的加載器之間為雙向引用關系。

一個類的實例總是引用代表這個類的Class對象。在Object類中定義了getClass()方法,這個方法返回代表對象所屬類的Class對象的引用。此外,所有的Java類都有一個靜態屬性class,它引用代表這個類的Class對象。

Java虛擬機自帶的類加載器(前面介紹的三種類加載器)在JVM運行過程中,會始終存在,而這些類加載器則會始終引用它們所加載的類的Class對象,因此這些Class對象始終是可觸及的。因此,由Java虛擬機自帶的類加載器所加載的類,在虛擬機的生命周期中,始終不會被卸載。

那么,我們是不是就完全不能在Java程序運行過程中,動態修改我們使用的類了嗎?答案是否定的!根據上面的分析,通過Java虛擬機自帶的類加載器加載的類無法卸載,我們可以自定義類加載器來加載Java程序,通過自定義類加載器加載的Java類,是可以被卸載的。

2.2 自定義類加載器

前面介紹到,類加載的雙親委派模型,是推薦模型,在loadClass中實現的,并不是必須使用的模型。我們可以通過自定義類加載器,直接加載我們需要的Java類,而不委托給父類加載器。

詳解Java類動態加載和熱替換

如上圖所示,我們有自定義的類加載器MyClassLoader,用來加載類MyClass,則在JVM中,會存在上面三類引用(上圖忽略這三種類型對象對其他的對象的引用)。如果我們將左邊的三個引用變量,均設置為null,那么此時,已經加載的MyClass將會被卸載。

2.3 動態卸載存在的問題

動態卸載需要借助于JVM的垃圾收集功能才可以做到,但是我們知道,JVM的垃圾回收,只有在堆內存占用比較高的時候,才會觸發。即使我們調用了System.gc(),也不會立即執行垃圾回收操作,而只是告訴JVM需要執行垃圾回收,至于什么時候垃圾回收,則要看JVM自己的垃圾回收策略。

但是我們不需要悲觀,即使動態卸載不是那么牢靠,但是實現動態的Java類的熱替換還是有希望的。

3. Java類的熱替換

下面通過代碼來介紹Java類的熱替換方法(代碼簡陋,主要為了說明問題):

如下面的代碼:

首先定義一個自定義類加載器:

package zmj;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;public class FileClassLoader extends ClassLoader { private String fileName; public void setFileName(String fileName) {this.fileName = fileName; } public Class loadClass(String name) throws ClassNotFoundException {if (name.startsWith('java')) { return getSystemClassLoader().loadClass(name);}Class cls = null;File classF = new File(fileName);try { cls = instantiateClass(name, new FileInputStream(classF), classF.length());} catch (IOException e) { e.printStackTrace();}return cls; } private Class instantiateClass(String name, InputStream fin, long len) throws IOException {byte[] raw = new byte[(int) len];fin.read(raw);fin.close();return defineClass(name, raw, 0, raw.length); }}

上面在loadClass時,先判斷類name(包含package的全限定名)是否以java開始,如果是java開始,則使用JVM自帶的類加載器加載。

然后定義一個簡單的動態加載類:

package zmj;public class SayHello { public void say() {System.out.println('hello ping...'); }}

在執行過程中,會動態修改打印內容,測試類的熱加載。

然后定義一個調用類:

package zmj;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class Main { public static void main(String[] args) throws InterruptedException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {while (true) { FileClassLoader fileClassLoader = new FileClassLoader(); fileClassLoader.setFileName('D:/workspace/idea/test/class-loader-test/target/classes/zmj/SayHello.class'); Object obj = null; obj = fileClassLoader.loadClass('zmj.SayHello').newInstance(); Method m = obj.getClass().getMethod('say', new Class[]{}); m.invoke(obj, new Object[]{}); Thread.sleep(2000);} }}

當我們運行上面Main程序過程中,我們動態修改執行內容(SayHello中,從 hello zmj... 更改為 hello ping...),最終展示的內容如下:

hello zmj...

hello zmj...

hello zmj...

hello ping...

hello ping...

hello ping...

以上就是詳解Java類動態加載和熱替換的詳細內容,更多關于Java類動態加載和熱替換的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品久久久久久久久妇女| 国产精品一页| 成人在线视频免费看| 快she精品国产999| 蜜臀a∨国产成人精品| 最近国产精品视频| 国产精品九九| 日韩大片免费观看| 免费观看久久av| 蜜臀av一区二区在线免费观看 | 国产精品久久久久av蜜臀| 欧美啪啪一区| 成人台湾亚洲精品一区二区| 秋霞影视一区二区三区| 亚洲一区二区三区四区五区午夜 | 另类中文字幕国产精品| 国产亚洲激情| 国产免费播放一区二区| 亚洲1234区| 蜜桃久久av一区| 麻豆极品一区二区三区| 亚洲a一区二区三区| 三级亚洲高清视频| 国产免费av国片精品草莓男男 | 日韩一区亚洲二区| 亚洲国产成人精品女人| 日韩久久一区| 欧洲一区二区三区精品| 久久不射网站| 国产一区丝袜| 免费在线欧美视频| 久久久久黄色| 视频一区视频二区中文字幕| 国产中文字幕一区二区三区| 国产精品人人爽人人做我的可爱| 国产美女撒尿一区二区| 蜜臀久久99精品久久一区二区| 欧美日韩一区二区三区不卡视频| 亚洲伦乱视频| 国产日产精品_国产精品毛片| 久久精品国产www456c0m| 国产精品最新| 日韩一区欧美二区| 免费一区二区三区在线视频| 樱桃成人精品视频在线播放| 捆绑调教美女网站视频一区 | 999久久久精品国产| 日本va欧美va精品发布| 免费久久久久久久久| 国产精品红桃| 久久国产福利| 美女网站视频一区| 国产精品网站在线看| 亚洲免费高清| 国产传媒在线| 国产欧美大片| 亚洲国产一区二区在线观看| 久久精品欧洲| 日韩1区2区日韩1区2区| 国产韩日影视精品| 97欧美在线视频| 欧美日本久久| 国产亚洲永久域名| 成人精品亚洲| 国产成人久久精品一区二区三区| 911亚洲精品| 一本一道久久a久久| 激情久久五月| 性欧美videohd高精| 精品亚洲成人| 国产美女亚洲精品7777| 99视频精品免费观看| 日韩中文视频| 国产aa精品| 美女国产精品久久久| 日韩精品免费视频人成| 久久亚洲精品伦理| 国产毛片一区| 亚洲男女自偷自拍| 欧美美女一区| 丝袜美腿诱惑一区二区三区 | 久久精品欧洲| 国产精品大片免费观看| 国产探花在线精品一区二区| 日韩高清在线不卡| 夜夜嗨av一区二区三区网站四季av| 国产精品亚洲一区二区三区在线观看| 麻豆国产欧美一区二区三区| 久久国产视频网| 日韩avvvv在线播放| 日本v片在线高清不卡在线观看| 999在线观看精品免费不卡网站| 1024精品一区二区三区| 九九在线精品| 91精品国产调教在线观看| 日韩网站中文字幕| 亚洲午夜黄色| 免费日韩av| 日韩视频1区| 欧美日韩精品一区二区三区视频| 中文字幕视频精品一区二区三区| 免费国产亚洲视频| 日韩激情啪啪| 国产精品国码视频| 国产一区二区三区国产精品| 成人综合一区| 99久久夜色精品国产亚洲狼| 欧美日韩国产精品一区二区亚洲| 久久先锋影音| 欧美日韩91| 国产精品二区影院| 97精品一区| 亚洲欧洲一区| 欧美一级二区| 精品一级视频| 黄毛片在线观看| 尤物精品在线| 久久国产三级| 国产精品成人a在线观看| 另类中文字幕国产精品| 香蕉久久国产| 国产精品久久久一区二区| 日韩av有码| 不卡在线一区| 日韩福利视频网| 91综合网人人| 亚洲少妇一区| 国产精品黄色片| 成人日韩在线观看| 丝袜国产日韩另类美女| 亚洲乱码视频| 成人台湾亚洲精品一区二区| 亚洲午夜电影| 日本电影久久久| 日本一区二区高清不卡| 亚洲精品网址| 国产乱码精品一区二区三区亚洲人| 成人国产精选| 国产精品老牛| 麻豆视频观看网址久久| 欧美成人亚洲| 国产精品麻豆成人av电影艾秋 | 精品三级在线| 亚洲一级网站| 日韩1区2区日韩1区2区| 日本а中文在线天堂| 亚洲毛片在线| 久久精品卡一| 欧美久久久网站| 国产综合精品| 国产精品亚洲一区二区在线观看| 国产aⅴ精品一区二区三区久久| 天堂网在线观看国产精品| 国产一区视频在线观看免费| 一本色道精品久久一区二区三区| 午夜宅男久久久| 久久一区视频| 一区在线免费观看| 六月丁香综合在线视频| 欧美肉体xxxx裸体137大胆| 日韩精品视频在线看| 精品成人免费一区二区在线播放| 亚洲欧美在线专区| 99热国内精品| 久久久久观看| 亚洲精品一级| 激情久久婷婷| 久久精品系列| 蜜桃视频一区二区| 亚洲成人精品| 亚洲乱亚洲高清| 伊伊综合在线| 国产精品成人一区二区网站软件| 亚洲爱爱视频| 午夜久久99| 国产伦久视频在线观看| 欧美日韩18| 99re国产精品| 在线日韩av| 久久伊人亚洲| 国产情侣久久| 另类国产ts人妖高潮视频| 不卡一二三区| 精品99久久| 亚洲深夜视频| 日韩欧美一区免费| 美女av在线免费看| 免费看av不卡| 国产在线观看www| 中文字幕日韩亚洲| 亚洲国产一区二区在线观看 | 91综合网人人| 日本在线不卡视频| 久久中文字幕导航| 久久精品国产大片免费观看| av中文资源在线资源免费观看| 亚洲神马久久| 国产亚洲精品久久久久婷婷瑜伽| 欧美日中文字幕| 免费黄网站欧美|