利用ClasserLoader實現(xiàn)jar包加載并調(diào)用里面的方法
1.ClasserLoader介紹?
classloader顧名思義,即是類加載。虛擬機(jī)把描述類的數(shù)據(jù)從class字節(jié)碼文件加載到內(nèi)存,并對數(shù)據(jù)進(jìn)行檢驗、轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機(jī)直接使用的Java類型,這就是虛擬機(jī)的類加載機(jī)制。了解java的類加載機(jī)制,可以快速解決運(yùn)行時的各種加載問題并快速定位其背后的本質(zhì)原因,也是解決疑難雜癥的利器。因此學(xué)好類加載原理也至關(guān)重要。
內(nèi)置類加載器
JVM 中內(nèi)置了三個重要的 ClassLoader
:
BootstrapClassLoader
(啟動類加載器):最頂層的加載類,由 C++實現(xiàn),通常表示為 null,并且沒有父級,主要用來加載 JDK 內(nèi)部的核心類庫(%JAVA_HOME%/lib
目錄下的rt.jar
、resources.jar
、charsets.jar
等 jar 包和類)以及被-Xbootclasspath
參數(shù)指定的路徑下的所有類。ExtensionClassLoader
(擴(kuò)展類加載器):主要負(fù)責(zé)加載%JRE_HOME%/lib/ext
目錄下的 jar 包和類以及被java.ext.dirs
系統(tǒng)變量所指定的路徑下的所有類。AppClassLoader
(應(yīng)用程序類加載器):面向我們用戶的加載器,負(fù)責(zé)加載當(dāng)前應(yīng)用 classpath 下的所有 jar 包和類。
除了這三種類加載器之外,用戶還可以加入自定義的類加載器來進(jìn)行拓展,以滿足自己的特殊需求。就比如說,我們可以對 Java 類的字節(jié)碼( .class
文件)進(jìn)行加密,加載時再利用自定義的類加載器對其解密。
2.代碼工程
實驗?zāi)繕?biāo)
實現(xiàn)加載外部jar包,并調(diào)用其中類方法
JarLoader
package com.et; import java.net.URL; import java.net.URLClassLoader; import java.lang.reflect.Method; import java.io.File; public class JarLoader { private URLClassLoader urlClassLoader; // load JAR file public void loadJar(String jarFilePath) throws Exception { File jarFile = new File(jarFilePath); URL jarUrl = jarFile.toURI().toURL(); urlClassLoader = new URLClassLoader(new URL[]{jarUrl}, this.getClass().getClassLoader()); System.out.println("JAR Loaded: " + jarFilePath); } //load class from JAR and invoke method public void invokeClassMethod(String className, String methodName) throws Exception { if (urlClassLoader != null) { Class<?> loadedClass = urlClassLoader.loadClass(className); Method method = loadedClass.getDeclaredMethod(methodName); method.invoke(loadedClass.newInstance()); System.out.println("Method Invoked: " + methodName); } else { System.out.println("ClassLoader is null, load a JAR first."); } } // unload JAR public void unloadJar() throws Exception { if (urlClassLoader != null) { urlClassLoader.close(); // close ClassLoader urlClassLoader = null; // let it recycle by jvm System.out.println("JAR Unloaded."); } else { System.out.println("No JAR to unload."); } } }
service(demo模塊)
創(chuàng)建sevice類
mvn install
打包成jar包package com.et.demo.service;
public class MockService implements Service { @Override public void printVersion() { System.out.println("11.0"); } }
package com.et.demo.service;
public interface Service { void printVersion(); }
以上只是一些關(guān)鍵代碼,所有代碼請參見下面代碼倉庫
代碼倉庫
- https://github.com/Harries/Java-demo(classloader)
3.測試
編寫測試類
package com.et; public class Main { public static void main(String[] args) throws Exception { JarLoader jarLoader = new JarLoader(); // load JAR jarLoader.loadJar("D:\\IdeaProjects\\Java-demo\\demo\\target\\demo-1.0-SNAPSHOT.jar"); // invoke the method jarLoader.invokeClassMethod("com.et.demo.service.MockService", "printVersion"); // unload JAR jarLoader.unloadJar(); } }
啟動main方法,查看日志
JAR Loaded: D:\IdeaProjects\Java-demo\demo\target\demo-1.0-SNAPSHOT.jar 11.0 Method Invoked: printVersion JAR Unloaded. Disconnected from the target VM, address: '127.0.0.1:53226', transport: 'socket' Process finished with exit code 0
到此這篇關(guān)于利用ClasserLoader實現(xiàn)jar包加載并調(diào)用里面的方法的文章就介紹到這了,更多相關(guān)ClasserLoader jar包加載并調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實現(xiàn)將PDF轉(zhuǎn)為圖片格式的方法詳解
PDF文件和圖片文件,這是兩種完全不一樣的格式,可是有的時候這兩種格式卻是有相互轉(zhuǎn)換的需要,本文將介紹如何通過Java應(yīng)用程序快速高效地將PDF轉(zhuǎn)為圖片格式。一起來看看吧2023-03-03java反編譯工具jd-gui-osx?for?mac?M1芯片無法使用的問題及解決
這篇文章主要介紹了java反編譯工具jd-gui-osx?for?mac?M1芯片無法使用的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01mybatis mapper.xml 區(qū)間查詢條件詳解
這篇文章主要介紹了mybatis mapper.xml 區(qū)間查詢條件詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09Java基礎(chǔ)之?dāng)?shù)組模擬循環(huán)隊列
這篇文章主要介紹了Java基礎(chǔ)之?dāng)?shù)組模擬循環(huán)隊列,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們也有非常好的幫助,需要的朋友可以參考下2021-04-04Spring中過濾器(Filter)和攔截器(Interceptor)的區(qū)別和聯(lián)系解析
在我們?nèi)粘5拈_發(fā)中,我們經(jīng)常會用到Filter和Interceptor,這篇文章主要介紹了Spring中過濾器(Filter)和攔截器(Interceptor)的區(qū)別和聯(lián)系?,需要的朋友可以參考下2022-10-10