利用ClasserLoader實(shí)現(xiàn)jar包加載并調(diào)用里面的方法
1.ClasserLoader介紹?
classloader顧名思義,即是類加載。虛擬機(jī)把描述類的數(shù)據(jù)從class字節(jié)碼文件加載到內(nèi)存,并對(duì)數(shù)據(jù)進(jìn)行檢驗(yàn)、轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機(jī)直接使用的Java類型,這就是虛擬機(jī)的類加載機(jī)制。了解java的類加載機(jī)制,可以快速解決運(yùn)行時(shí)的各種加載問題并快速定位其背后的本質(zhì)原因,也是解決疑難雜癥的利器。因此學(xué)好類加載原理也至關(guān)重要。
內(nèi)置類加載器
JVM 中內(nèi)置了三個(gè)重要的 ClassLoader:
BootstrapClassLoader(啟動(dòng)類加載器):最頂層的加載類,由 C++實(shí)現(xiàn),通常表示為 null,并且沒有父級(jí),主要用來加載 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)行拓展,以滿足自己的特殊需求。就比如說,我們可以對(duì) Java 類的字節(jié)碼( .class 文件)進(jìn)行加密,加載時(shí)再利用自定義的類加載器對(duì)其解密。
2.代碼工程
實(shí)驗(yàn)?zāi)繕?biāo)
實(shí)現(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)鍵代碼,所有代碼請(qǐng)參見下面代碼倉庫
代碼倉庫
- https://github.com/Harries/Java-demo(classloader)
3.測(cè)試
編寫測(cè)試類
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();
}
}
啟動(dòng)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實(shí)現(xiàn)jar包加載并調(diào)用里面的方法的文章就介紹到這了,更多相關(guān)ClasserLoader jar包加載并調(diào)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)將PDF轉(zhuǎn)為圖片格式的方法詳解
PDF文件和圖片文件,這是兩種完全不一樣的格式,可是有的時(shí)候這兩種格式卻是有相互轉(zhuǎn)換的需要,本文將介紹如何通過Java應(yīng)用程序快速高效地將PDF轉(zhuǎn)為圖片格式。一起來看看吧2023-03-03
java反編譯工具jd-gui-osx?for?mac?M1芯片無法使用的問題及解決
這篇文章主要介紹了java反編譯工具jd-gui-osx?for?mac?M1芯片無法使用的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
JAVA實(shí)現(xiàn)簡單搶紅包算法(模擬真實(shí)搶紅包)
這篇文章主要介紹了JAVA實(shí)現(xiàn)簡單搶紅包算法(模擬真實(shí)搶紅包)的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12
mybatis mapper.xml 區(qū)間查詢條件詳解
這篇文章主要介紹了mybatis mapper.xml 區(qū)間查詢條件詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Eclipse啟動(dòng)Tomcat超時(shí)問題的解決方法
2013-03-03
Java Swing JFrame窗口的實(shí)現(xiàn)
這篇文章主要介紹了Java Swing JFrame窗口的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
Java基礎(chǔ)之?dāng)?shù)組模擬循環(huán)隊(duì)列
這篇文章主要介紹了Java基礎(chǔ)之?dāng)?shù)組模擬循環(huán)隊(duì)列,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們也有非常好的幫助,需要的朋友可以參考下2021-04-04
Spring中過濾器(Filter)和攔截器(Interceptor)的區(qū)別和聯(lián)系解析
在我們?nèi)粘5拈_發(fā)中,我們經(jīng)常會(huì)用到Filter和Interceptor,這篇文章主要介紹了Spring中過濾器(Filter)和攔截器(Interceptor)的區(qū)別和聯(lián)系?,需要的朋友可以參考下2022-10-10

