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

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

Java基于自定義類加載器實現熱部署過程解析

瀏覽:28日期:2022-09-04 15:12:59

熱部署:

熱部署就是在不重啟應用的情況下,當類的定義即字節碼文件修改后,能夠替換該Class創建的對象。一般情況下,類的加載都是由系統自帶的類加載器完成,且對于同一個全限定名的java類,只能被加載一次,而且無法被卸載。可以使用自定義的 ClassLoader 替換系統的加載器,創建一個新的 ClassLoader,再用它加載 Class,得到的 Class 對象就是新的(因為不是同一個類加載器),再用該 Class 對象創建一個實例,從而實現動態更新。如:修改 JSP 文件即生效,就是利用自定義的 ClassLoader 實現的。

還需要創建一個守護線程,不斷地檢查class文件是否被修改過,通過判斷文件的上次修改時間實現。

演示:

原來的程序:

Java基于自定義類加載器實現熱部署過程解析

修改后重新編譯:

Java基于自定義類加載器實現熱部署過程解析

代碼:

package Dynamic; import java.io.*;import java.nio.file.Files;import java.nio.file.Path;import java.util.concurrent.TimeUnit; public class ClassLoadStudy { public static void main(String[] args) throws Exception { HotDeploy hot = new HotDeploy('Dynamic.Task'); hot.monitor(); while (true) { TimeUnit.SECONDS.sleep(2); hot.getTask().run(); } }} // 熱部署 class HotDeploy { private static volatile Runnable instance; private final String FILE_NAME; private final String CLASS_NAME; public HotDeploy(String name) { CLASS_NAME = name; // 類的完全限定名 name = name.replaceAll('.', '/') + '.class'; FILE_NAME = (getClass().getResource('/') + name).substring(6); // 判斷class文件修改時間使用,substring(6)去掉開頭的file:/ } // 獲取一個任務 public Runnable getTask() { if (instance == null) { // 雙重檢查鎖,單例,線程安全 synchronized (HotDeploy.class) {if (instance == null) { try { instance = createTask(); } catch (Exception e) { e.printStackTrace(); }} } } return instance; } // 創建一個任務,重新加載 class 文件 private Runnable createTask() { try { Class clazz = MyClassLoader.getLoader().loadClass(CLASS_NAME); if (clazz != null)return (Runnable)clazz.newInstance(); } catch (Exception e) { e.printStackTrace(); } return null; } // 監視器,監視class文件是否被修改過,如果是的話,則重新加載 public void monitor() throws IOException { Thread t = new Thread(()->{ try {long lastModified = Files.getLastModifiedTime(Path.of(FILE_NAME)).toMillis();while(true) { Thread.sleep(500); long now = Files.getLastModifiedTime(Path.of(FILE_NAME)).toMillis(); if(now != lastModified) { // 如果class文件被修改過了 lastModified = now; instance = createTask(); // 重新加載 }} } catch (InterruptedException | IOException e) {e.printStackTrace(); } }); t.setDaemon(true); // 守護線程 t.start(); }} // 自定義的類加載器class MyClassLoader extends ClassLoader { @Override public Class<?> findClass(String name) throws ClassNotFoundException { try { String fileName = '/' + name.replaceAll('.', '/') + '.class'; InputStream is = getClass().getResourceAsStream(fileName); byte[] b = is.readAllBytes(); return defineClass(name, b, 0, b.length); } catch (IOException e) { throw new ClassNotFoundException(name); } } public static MyClassLoader getLoader() { return new MyClassLoader(); }}

遇到的坑:

剛開始自定義類加載器時,重寫的是 loadClass(String name) 方法,但不斷地報錯,后來明白了,因為 Task 類實現了 Java.lang.Runnable 接口,且重寫 loadClass 方法破壞了雙親委派機制,導致了自定義的類加載器去加載 java.lang.Runnable,但被Java安全機制禁止了所以會報錯。defineClass調用preDefineClass,preDefineClass 會檢查包名,如果以java開頭,就會拋出異常,因為讓用戶自定義的類加載器來加載Java自帶的類庫會引起混亂。

于是又重寫findClass 方法,但還是不行,findClass方法總是得不到執行,因為編譯好的類是在 classpath 下的,而自定義的 ClassLoader 的父加載器是 AppClassLoader,由于雙親委派機制,類就會被 Application ClassLoader來加載了。因此自定義的 findClass 方法就不會被執行。解決方法是,向構造器 ClassLoader(ClassLoader parent) 傳入null,或傳入 getSystemClassLoader().getParent()。

還有就是路徑問題:

path不以 / 開頭時,默認是從此類所在的包下取資源;path 以 / 開頭時,則是從ClassPath根下獲取; URL getClass.getResource(String path) InputStream getClass().getResourceAsStream(String path) getResource('') 返回當前類所在的包的路徑 getResource('/') 返回當前的 classpath 根據路徑 path 不能以 / 開始,path 是從 classpath 根開始算的, 因為classloader 不是用戶自定義的類,所以沒有相對路徑的配置文件可以獲取,所以默認都是從哪個classpath 路徑下讀取,自然就沒有必要以 / 開頭了 。 URL Class.getClassLoader().getResource(String path) InputStream Class.getClassLoader().getResourceAsStream(String path)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久久人人人| 亚洲18在线| 亚洲人亚洲人色久| 国产夫妻在线| 波多野结衣久久精品| 国产成人精品三级高清久久91| 国产精品久久| 精品久久久久中文字幕小说| 日韩在线网址| 国产精品sss在线观看av| 精品国产亚洲一区二区三区在线 | 亚洲三级视频| 亚洲尤物av| 91嫩草精品| 国产精品成人国产| 久久精品五月| 亲子伦视频一区二区三区| 99久久夜色精品国产亚洲狼| 伊人影院久久| 亚洲乱码视频| 免费观看亚洲天堂| 高清久久精品| 午夜精品婷婷| 日韩av电影一区| 激情久久一区二区| 久久久国产精品一区二区中文| 国产综合激情| 亚洲一区欧美| 国产日韩欧美一区在线| 岛国av在线网站| 蜜桃国内精品久久久久软件9| 中文不卡在线| 美腿丝袜亚洲一区| 在线 亚洲欧美在线综合一区| 国产欧美三级| 免费黄色成人| 日韩精品欧美精品| 欧美三级精品| 少妇精品久久久一区二区| 国产精品黄网站| 秋霞国产精品| 日韩精品视频网站| 久久久久网站| 日韩高清在线不卡| 丰满少妇一区| 蜜桃久久久久久久| 国产传媒在线| 亚洲精品综合| 久久蜜桃精品| 国产精品久一| 国产精品女主播一区二区三区| 日本不卡视频一二三区| 高清av不卡| 综合亚洲色图| 日韩免费视频| 日韩欧美中文字幕电影| 久久中文字幕二区| 国产精品手机在线播放| 亚洲欧美日韩高清在线| 国产激情精品一区二区三区| 久久xxxx| 精品捆绑调教一区二区三区| 日韩高清在线不卡| 国产在线欧美| 激情综合婷婷| 欧美一区二区三区久久精品| 久久精品官网| 欧美激情一区| 伊人www22综合色| 群体交乱之放荡娇妻一区二区| 欧美一级二区| 香蕉精品999视频一区二区| 亚洲美女久久精品| 欧美aⅴ一区二区三区视频| 日韩欧美三区| 99成人在线| 久久久精品久久久久久96| 国产成人精品一区二区三区视频| 日韩精品a在线观看91| 亚洲在线网站| 狠狠干综合网| 日韩精品网站| 97精品视频在线看| 精品一区二区三区视频在线播放| 日韩一区二区三区免费视频| 性一交一乱一区二区洋洋av| 精品欧美激情在线观看| 欧美日韩精品在线一区| 四虎4545www国产精品 | 男人天堂欧美日韩| 激情视频一区二区三区| 九色porny丨国产首页在线| 国产在线观看www| 国产aa精品| 国产 日韩 欧美 综合 一区| 久久在线91| 精品中国亚洲| 欧美激情日韩| 精品免费在线| 在线看片国产福利你懂的| 高清av一区| 丁香六月综合| 日韩精品第一区| 欧美sss在线视频| 麻豆视频在线看| av在线最新| 亚洲美女久久精品| 99精品视频精品精品视频| 亚洲第一区色| 午夜欧美理论片| 视频在线在亚洲| 天堂精品久久久久| 欧美欧美黄在线二区| 国产精品一区二区三区www| 国产精品亚洲一区二区在线观看| 国产乱码精品一区二区三区亚洲人| 国产精品色婷婷在线观看| 国产福利一区二区精品秒拍| 卡一精品卡二卡三网站乱码| 美女毛片一区二区三区四区最新中文字幕亚洲| 国产精品第一国产精品| 久久精品午夜| 亚洲高清av| 一区二区三区午夜视频| 国产日韩一区二区三区在线 | 99视频一区| 四虎在线精品| 国产精品对白| 久久三级福利| 一本综合精品| 麻豆一区在线| 在线看片福利| 中国女人久久久| 日本欧美久久久久免费播放网| 久久99青青| 日本精品不卡| 狠狠色综合网| 国产伦理久久久久久妇女| 色一区二区三区| 日本大胆欧美人术艺术动态| 国产精品国产三级在线观看| 久久青草久久| 日韩欧美高清一区二区三区| 国产中文欧美日韩在线| 国产精品美女久久久浪潮软件| 国产精品网址| 久久国产日韩| 日韩精品导航| 韩国精品主播一区二区在线观看 | 国产成人精品免费视| 激情欧美一区二区三区| 日韩欧美在线精品| 日韩欧美看国产| 婷婷精品在线| 久久九九精品| 日韩一区二区三区在线看| 成人国产精品| 亚洲精一区二区三区| 色在线视频观看| 中文字幕一区二区三区日韩精品| 精品日韩一区| 在线观看亚洲精品福利片| 精品视频网站| 亚洲乱码久久| 99久精品视频在线观看视频| 久久狠狠亚洲综合| 性欧美xxxx免费岛国不卡电影| 欧美自拍一区| 欧美午夜不卡影院在线观看完整版免费| 欧美日本不卡高清| 在线国产一区二区| 精品视频自拍| 日本a级不卡| 中日韩男男gay无套| 日韩欧美精品综合| 欧美精品国产白浆久久久久| 亚洲欧洲午夜| 免费福利视频一区二区三区| 欧美日韩亚洲一区| 亚洲精品成人一区| 欧美日韩激情在线一区二区三区| 美女久久精品| 日韩av午夜在线观看| 伊人成人网在线看| 国产成人精品亚洲日本在线观看| 国产精品一区免费在线| 蜜桃av一区二区在线观看| 日韩三区免费| 成人精品国产亚洲| 久久av免费| 国产日产一区| 亚洲视频国产| 久久亚洲图片| 女主播福利一区| 日韩精品麻豆| 久久久男人天堂| 97精品中文字幕| 麻豆久久一区| 国产精品亚洲综合色区韩国| 亚洲精品系列|