亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

代碼倉庫

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)文章

最新評論