<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
載入器名 | 方法名 | 作用 |
---|---|---|
Bootstrap class loader | 無 | 虛擬機器器的內建類載入器,底層是用C++實現的,沒有父載入器。主要載入系統環境的一些jar包和.class檔案。C/C++語言編寫,是虛擬機器器的一部分,無法在Java程式碼中直接獲取它的參照。可以通過 System.getProperty(“sun.boot.class.path”)獲取其載入路徑下的檔案 |
Platform class loader (也稱為ExtClassLoader) | getPlatformClassLoader() | 平臺類載入器,負責載入JDK中一些特殊的模組。主要載入java.ext.dirs下的.class檔案 |
System class loader (也稱為AppClassLoader) | getSystemClassLoader() | 系統類載入器,負責載入使用者類路徑上所指定的類庫。主要載入java.class.path下的.class檔案,是面向使用者編寫類的類載入器,即自己寫的類或者引入的第三方庫通常由此載入器載入 |
方法名 | 作用 |
---|---|
protected ClassLoader(String name, ClassLoader parent) | 建立指定名稱name的新類載入器,並使用指定的父類別載入器parent進行委派 |
public String getName() | 返回此類載入器的名稱,如果此類載入器未命名,則返回null |
public Class loadClass(String name, boolean resolve) | 載入具有指定類名稱的類,resolve為true表示解析類參照。loadClass方法會先呼叫getClassLoadingLock方法獲取鎖,再呼叫findLoadedClass方法檢查類是否已載入,如果未載入,則往父載入器一直遞迴呼叫loadClass載入該類,如果父載入器也載入不了該類,才呼叫findClass方法獲取Class物件,而findClass是虛擬方法由子類實現。其實現使用defineClass(String name, byte[] b, int off, int len)方法可以將class檔案的位元組陣列轉為Class物件,最後使用resolveClass方法進行類的連結。而由於獲取該位元組陣列的方法是很多樣的,所以類載入的方式也非常多樣,如本地載入、網路載入、壓縮包中載入、自己構建Class檔案 |
protected Object getClassLoadingLock(String className) | 返回類載入操作的鎖物件。 如果此ClassLoader物件註冊為支援並行,則該方法返回與指定類名 className關聯的專用物件。否則該方法將返回此ClassLoader物件,即同一時間一個ClassLoader只能載入一個類 |
protected final Class findLoadedClass(String name) | 如果Java虛擬機器器已將此載入程式記錄為具有給定全限定類名稱的類的初始載入程式,則返回具有給定全限定類名稱的類。否則返回 null |
protected Class findClass(String name) | 查詢具有指定全限定類名的類。這個方法是空方法應該被子類重寫,並且被呼叫在檢查請求類的父類別載入器之後,loadClass方法將呼叫這個方法 |
protected final Class<?> defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain) | 將位元組陣列轉換為具有給定保護域ProtectionDomain的類Class的範例。 如果指定的name以“java.”開頭,它只能由getPlatformClassLoader()獲取到的平臺類載入器或其祖先定義(define),否則將丟擲SecurityException。如果name不是null,則它必須等於位元組陣列b指定的類的全限定類名稱,否則將丟擲NoClassDefFoundError |
protected final Class<?> defineClass(String name, java.nio.ByteBuffer b, ProtectionDomain protectionDomain) | 將位元組緩衝區ByteBuffer轉換為具有給定保護域ProtectionDomain的類Class的範例。其餘和上面一樣 |
protected final void resolveClass(Class c) | 連結指定的類。類載入器可能會使用此方法連結類。如果類c已經被連結,那麼這個方法直接返回。 否則,將按照Java語言規範執行一章中的描述連結該類 |
通過上面我們可以知道類載入流程是
專案結構,out是編譯出的class檔案目錄,由於Test就在src目錄下,沒有包名,則其全限定類名為Test
public class Test extends ClassLoader { public static void main(String[] args) throws Exception { while(true) { try { Test test = new Test(); // 編譯後的class檔案位置 ./表示程式碼根目錄 String classFile = "./out/production/Java_hot_replace/Test.class"; FileInputStream fis = new FileInputStream(classFile); byte[] bytes = new byte[1024*10]; int len = fis.read(bytes); //將位元組陣列轉為Class類物件 Test為全限定類名 Class clazz = test.defineClass("Test", bytes, 0 ,len); //使用反射根據新的Class物件建立新物件,並執行其printStr方法 Object object = clazz.newInstance(); Method m = object.getClass().getMethod("printStr", new Class[] {}); m.invoke(object, new Object[] {}); Thread.sleep(2000); } catch(Exception e) { e.printStackTrace(); try { Thread.sleep(2000); } catch(InterruptedException ex) { } } } } public void printStr() { System.out.println("A"); } }
啟動後修改程式碼,然後點重新編譯
可以看到程式碼被熱替換了
public class Test extends ClassLoader { public static void main(String[] args) throws Exception { MyClassLoader classLoader = new MyClassLoader(); Class classLoaded = classLoader.loadClass("MyClass"); classLoaded = null; classLoader = null; System.gc(); } }
到此這篇關於Java ClassLoader虛擬類實現程式碼熱替換的範例程式碼的文章就介紹到這了,更多相關Java ClassLoader程式碼熱替換內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45