最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用ClasserLoader實現(xiàn)jar包加載并調用里面的方法

 更新時間:2024年09月19日 08:40:10   作者:HBLOG  
classloader即是類加載,虛擬機把描述類的數(shù)據(jù)從class字節(jié)碼文件加載到內存,并對數(shù)據(jù)進行檢驗、轉換解析和初始化,了解java的類加載機制,可以快速解決運行時的各種加載問題并快速定位其背后的本質原因,本文介紹了如何利用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.jarresources.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(); }

以上只是一些關鍵代碼,所有代碼請參見下面代碼倉庫

代碼倉庫

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去除重復項算法示例

    這篇文章主要介紹了java數(shù)據(jù)結構與算法之noDups去除重復項算法實現(xiàn)技巧,程序代碼非常簡單,關鍵在于循環(huán)與判定,需要的朋友可以參考下
    2016-08-08
  • 純Java實現(xiàn)高效MP3音頻合并的詳細方案

    純Java實現(xiàn)高效MP3音頻合并的詳細方案

    在 Java 音頻處理中,MP3 格式的合并一直是一項技術難點,大多數(shù)開發(fā)者默認使用 FFmpeg 命令行來完成任務,但會帶來許多問題,所以本文將介紹一種 純 Java 實現(xiàn)的 MP3 合并方法,需要的朋友可以參考下
    2025-11-11
  • nacos配置注冊中心時指定命名空間不起作用的問題

    nacos配置注冊中心時指定命名空間不起作用的問題

    這篇文章主要介紹了nacos配置注冊中心時指定命名空間不起作用的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • java之map集合存放null值的問題

    java之map集合存放null值的問題

    這篇文章主要介紹了java之map集合存放null值的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java實現(xiàn)UTF-8編碼與解碼方式

    Java實現(xiàn)UTF-8編碼與解碼方式

    這篇文章主要介紹了Java實現(xiàn)UTF-8編碼與解碼方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 在Java中使用ModelMapper簡化Shapefile屬性轉JavaBean實戰(zhàn)過程

    在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)

    本文主要介紹了Java中的三種校驗注解的使用(@Valid,@Validated和@PathVariable),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • java動態(tài)代理(jdk與cglib)詳細解析

    java動態(tài)代理(jdk與cglib)詳細解析

    靜態(tài)代理:由程序員創(chuàng)建或特定工具自動生成源代碼,再對其編譯。在程序運行前,代理類的.class文件就已經存在了
    2013-09-09
  • java異常中throw和throws的區(qū)別及說明

    java異常中throw和throws的區(qū)別及說明

    這篇文章主要介紹了java異常中throw和throws的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 解決HttpServletResponse和HttpServletRequest取值的2個坑

    解決HttpServletResponse和HttpServletRequest取值的2個坑

    這篇文章主要介紹了解決HttpServletResponse和HttpServletRequest取值的2個坑問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評論

石家庄市| 张家界市| 宜阳县| 喜德县| 报价| 岳普湖县| 岳池县| 南澳县| 潍坊市| 仪陇县| 赞皇县| 花垣县| 广南县| 江西省| 屏山县| 红原县| 洱源县| 天长市| 丰都县| 连南| 东明县| 麦盖提县| 津南区| 乌拉特前旗| 淳化县| 琼海市| 淅川县| 翁牛特旗| 桦甸市| 广德县| 盱眙县| 东海县| 克什克腾旗| 伽师县| 务川| 阳江市| 稷山县| 阿克苏市| 民权县| 江孜县| 稻城县|