利用ClasserLoader實現(xiàn)jar包加載并調用里面的方法
1.ClasserLoader介紹?
classloader顧名思義,即是類加載。虛擬機把描述類的數(shù)據(jù)從class字節(jié)碼文件加載到內存,并對數(shù)據(jù)進行檢驗、轉換解析和初始化,最終形成可以被虛擬機直接使用的Java類型,這就是虛擬機的類加載機制。了解java的類加載機制,可以快速解決運行時的各種加載問題并快速定位其背后的本質原因,也是解決疑難雜癥的利器。因此學好類加載原理也至關重要。
內置類加載器
JVM 中內置了三個重要的 ClassLoader:
BootstrapClassLoader(啟動類加載器):最頂層的加載類,由 C++實現(xiàn),通常表示為 null,并且沒有父級,主要用來加載 JDK 內部的核心類庫(%JAVA_HOME%/lib目錄下的rt.jar、resources.jar、charsets.jar等 jar 包和類)以及被-Xbootclasspath參數(shù)指定的路徑下的所有類。ExtensionClassLoader(擴展類加載器):主要負責加載%JRE_HOME%/lib/ext目錄下的 jar 包和類以及被java.ext.dirs系統(tǒng)變量所指定的路徑下的所有類。AppClassLoader(應用程序類加載器):面向我們用戶的加載器,負責加載當前應用 classpath 下的所有 jar 包和類。
除了這三種類加載器之外,用戶還可以加入自定義的類加載器來進行拓展,以滿足自己的特殊需求。就比如說,我們可以對 Java 類的字節(jié)碼( .class 文件)進行加密,加載時再利用自定義的類加載器對其解密。
2.代碼工程
實驗目標
實現(xiàn)加載外部jar包,并調用其中類方法
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(); }
以上只是一些關鍵代碼,所有代碼請參見下面代碼倉庫
代碼倉庫
- 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
到此這篇關于利用ClasserLoader實現(xiàn)jar包加載并調用里面的方法的文章就介紹到這了,更多相關ClasserLoader jar包加載并調用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java數(shù)據(jù)結構與算法之noDups去除重復項算法示例
這篇文章主要介紹了java數(shù)據(jù)結構與算法之noDups去除重復項算法實現(xiàn)技巧,程序代碼非常簡單,關鍵在于循環(huán)與判定,需要的朋友可以參考下2016-08-08
在Java中使用ModelMapper簡化Shapefile屬性轉JavaBean實戰(zhàn)過程
本文介紹了在Java中使用ModelMapper庫簡化Shapefile屬性轉JavaBean的過程,對比了原始的set方法和構造方法,展示了如何使用ModelMapper進行動態(tài)屬性映射,從而減少手動編寫轉換代碼的工作量,通過示例代碼,展示了如何使用GeoTools讀取Shapefile屬性并將其轉換為JavaBean對象2025-02-02
Java中的三種校驗注解的使用(@Valid,@Validated和@PathVariable)
本文主要介紹了Java中的三種校驗注解的使用(@Valid,@Validated和@PathVariable),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-04-04
解決HttpServletResponse和HttpServletRequest取值的2個坑
這篇文章主要介紹了解決HttpServletResponse和HttpServletRequest取值的2個坑問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12

