波多野结衣 蜜桃视频,国产在线精品露脸ponn,a v麻豆成人,AV在线免费小电影

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

本文介紹了類加載器:如何加載不同版本的JAR的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!

問(wèn)題描述

我必須使用第三方平臺(tái),但該平臺(tái)有無(wú)法替換的JARlibjar-1.0.0.jar舊版本。該平臺(tái)允許我在其上運(yùn)行我自己的(平面文件)包。我將libjar-2.0.0.jar的新版本放在我的包/包/包名稱/外部-jar下。當(dāng)我使用URLClassLoader加載libjar-2.0.0.jar,然后打印出所有聲明的方法時(shí),我能夠看到2.0.0JAR中的方法。然而,當(dāng)我調(diào)用時(shí),我總是得到NoSuchMethodException。當(dāng)我打印newobj.class.getProtectionDomain().getCodeSource().getLocation().toString()時(shí),總是顯示libjar-1.0.0.jar。誰(shuí)能解釋一下我做錯(cuò)了什么,以及我需要做些什么才能在運(yùn)行時(shí)強(qiáng)制使用特定JAR中的類?

以下是我的代碼的快照

File f = new File(path);

URL[] urls = new URL[1];
urls[0] = f.toURI().toURL();
ClassLoader cl = new URLClassLoader(urls);

Class<?> utilsClass = cl.loadClass("com.myclass");
Constructor<?> cons = utilsClass.getConstructor(First.class, Second.class);
Object utils = cons.newInstance(firstObj, new Second());
if (utilsClass.getProtectionDomain() != null) {
           LOGGER.info(utilsClass.getProtectionDomain().getCodeSource().getLocation().toString());
}
// this print out --- 1.0.0.jar instead of 2.0.0.jar

for (Method m : utilsClass.getDeclaredMethods()) {
     LOGGER.info("methods: " + m.getName());
}
// method shows the "methodILookFor"

Method m = utilsClass.getDeclaredMethod("methodILookFor", Target.class, String[].class, Object.class);
// always throws NoSuchMethodException

m.invoke(utils, target, string, obj);

推薦答案

類加載工作原理

URLClassLoader用于加載應(yīng)用程序類路徑中尚未指定的類。

類加載遵循委托原則。如果類未加載,則類加載器將加載類的任務(wù)委托給其父類加載器。如果父類加載器未找到該類,則會(huì)將其傳遞給子類加載器以加載類。
在您的例子中,URLClassLoader將類加載委托給其父級(jí),即Application Class Loader
Application Class Loaderlibjar-1.0.0.jar中查找類。因此,URLClassLoader最終不從libjar-2.0.0.jar加載類。

自定義類加載器

這里是一個(gè)擴(kuò)展URLClassLoader的自定義類加載器的簡(jiǎn)單示例。這個(gè)類加載器在委托給它的父類加載器之前嘗試從它的URL加載類。它應(yīng)該能夠加載示例中所需的不同版本的JAR。您將找到一個(gè)帶有單元測(cè)試的完整示例here。

P.S.Java 9中的類加載已更改。Java 9未對(duì)其進(jìn)行測(cè)試,因此可能無(wú)法正常工作。

public class MyClassLoader extends URLClassLoader {

    public MyClassLoader(URL[] urls, ClassLoader parent) {
        super(urls, parent);
    }

    @Override
    protected synchronized Class<?> loadClass(String name,
            boolean resolve) throws ClassNotFoundException {

        // 1. Check if the class has already been loaded
        Class<?> clazz = findLoadedClass(name);

        ClassLoader parentCL = getParent();

        // 2. If the class is not loaded and the class name starts
        // with 'java.' or 'javax.', delegate loading to parent
        if (clazz == null && parentCL != null && (name.startsWith(
                "java.") || name.startsWith(
                "javax."))) {
            clazz = parentCL.loadClass(name);

        }

        // 3. If the class is still null, try to load the class from the URL
        // (since we have already taken care of 'java.' and 'javax.'
        if (clazz == null) {
            try {
                clazz = super.findClass(name);
            } catch (ClassNotFoundException e) {
                //don't do anything
            }
        }

        // 4. If the class is still null, let the parent class loader load it.
        // Previously, we allowed 'java.' and 'javax.' classes to be loaded
        // from parent
        if (clazz == null && parentCL != null) {
            clazz = parentCL.loadClass(name);
        }

        // 5. If the class is still null, throw a class not found exception
        if (clazz == null) {
            throw new ClassNotFoundException(name);
        }

        if (resolve) {
            resolveClass(clazz);
        }

        return clazz;
    }
}

這篇關(guān)于類加載器:如何加載不同版本的JAR的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,

分享到:
標(biāo)簽:JAR 加載 版本
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定