一個簡單的類加載器URLClassLoader案例
類加載器之URLClassLoader的簡單demo
最近,看了一點(diǎn)反射相關(guān)的知識,感覺Java 的知識還有很多需要學(xué)習(xí)的,這也是一個很大的挑戰(zhàn)吧。
這里寫了一個小 demo,來加深對于反射的理解。
public class Test { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, IOException { URL[] urls = new URL[] {new URL("http://192.168.119.132:8080/images/animal.jar")}; URLClassLoader classLoader = new URLClassLoader(urls); //加載類以后就可以得到 Class 對象了 Class<?> clazz = classLoader.loadClass("com.learn.animal.Dog"); classLoader.close(); //加載完類以后就可以刪除了。 //關(guān)閉 classLoader, 否則會造成 資源泄露 Resource leak //這里不使用默認(rèn)的構(gòu)造器,使用帶參數(shù)的構(gòu)造器 獲取特殊的構(gòu)造器 Constructor<?> con = clazz.getDeclaredConstructor(String.class, int.class, int.class); //使用構(gòu)造器創(chuàng)建對象 Object ob = con.newInstance("小黑",12,50); //在調(diào)用 Dog 對象的 say 方法,返回對 Dog 對象自己的描述 Method mtd0 = clazz.getMethod("say", new Class<?>[] {}); String dogSay = (String)mtd0.invoke(ob, new Object[] {}); System.out.println(dogSay); //再使用setter 方法,改變屬性 模擬 Dog 對象,逐漸長大,變胖 哈哈! System.out.println("Three years later......"); Method mtd1 = clazz.getMethod("setAge", int.class); mtd1.invoke(ob, 15); Method mtd2 = clazz.getMethod("setWeight", int.class); mtd2.invoke(ob, 70); //注意這些方法是有返回值的! 返回值都是 Object 類型,需要自己強(qiáng)轉(zhuǎn)類型 dogSay = (String)mtd0.invoke(ob, new Object[] {}); System.out.println(dogSay); System.out.println("It's over!"); } }
這里的 URL 資源,我用的是虛擬機(jī)里面的搭建的簡單的 nginx 服務(wù)器,也是看著別人的教程搭建的,很簡陋的一個服務(wù)器,哈哈。但是,這里足夠使用了,如果沒有條件,或者想簡單一點(diǎn),可以使用本地的文件系統(tǒng)。
使用 file:///jar包地址
這個替換就行了。
這里使用的 jar 包也很簡單,但是我直接打成了 jar 包,只有 class 文件了,我反編譯以下,把代碼圖片貼出來吧。
這個反編譯不是全部代碼,但是細(xì)節(jié)很簡單,只有一個 say()
方法,可以參照下面的運(yùn)行截圖,補(bǔ)全。
然后是運(yùn)行截圖,注意我這里這個 -encoding utf-8 是指定使用編碼字符集,因為cmd里面執(zhí)行代碼,如果有中文可能無法通過編譯。
總結(jié):Java 的 URLClassLoader 簡單使用也不是那么復(fù)雜,雖然技術(shù)本身很復(fù)雜,但是學(xué)習(xí)也不是一蹴而就的,學(xué)習(xí)也是一個過程,保持進(jìn)步,繼續(xù)努力。
到此這篇關(guān)于一個簡單的類加載器URLClassLoader案例的文章就介紹到這了,更多相關(guān)類加載器URLClassLoader案例內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Feign如何使用protobuf的類作為參數(shù)調(diào)用
這篇文章主要介紹了Feign如何使用protobuf的類作為參數(shù)調(diào)用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03Java 字符串轉(zhuǎn)float運(yùn)算 float轉(zhuǎn)字符串的方法
今天小編就為大家分享一篇Java 字符串轉(zhuǎn)float運(yùn)算 float轉(zhuǎn)字符串的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07Java基礎(chǔ)之內(nèi)部類與代理知識總結(jié)
今天帶大家復(fù)習(xí)Java的基礎(chǔ)知識,文中有非常詳細(xì)的介紹及圖文示例,對正在學(xué)習(xí)Java的小伙伴們很有幫助,需要的朋友可以參考下2021-06-06Java線程中的用戶態(tài)和內(nèi)核態(tài)解讀
這篇文章主要介紹了Java線程中的用戶態(tài)和內(nèi)核態(tài)解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06