在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java  網(wǎng)絡(luò)安全/ java urlclassloader 動態(tài)加載jar包時出現(xiàn)ClassNotF

java urlclassloader 動態(tài)加載jar包時出現(xiàn)ClassNotFound

我想給程序做一個加載外部jar的功能,在查閱相關(guān)資料后我了解到可以重寫URLClassLoader做到

所以我仿照網(wǎng)上的教程編寫了下方的代碼

public class ModuleClassLoader extends URLClassLoader {

    private static ModuleClassLoader instance;
    private static URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
    private static final Method ADD_URL = initAddMethod();

    static {
        ClassLoader.registerAsParallelCapable();
    }

    private ModuleClassLoader(URL[] urls) {
        super(urls);
    }

    public static ModuleClassLoader getInstance() {
        if (instance == null) {
            instance = new ModuleClassLoader(new URL[]{});
        }
        return instance;
    }

    private static Method initAddMethod() {
        try {
            Method addUrl = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
            addUrl.setAccessible(true);
            return addUrl;
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        }
    }

    public void loadJar(URL url) {
        try {
            ADD_URL.invoke(classLoader, url);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

調(diào)用部分

ModuleClassLoader moduleClassLoader = ModuleClassLoader.getInstance();
moduleClassLoader.loadJar(moduleJar.toURI().toURL());
System.out.println("加載成功");
Class<?> spawnClass = Class.forName("cc.zoyn.spawn.Spawn");
spawnClass.getMethod("onLoad").invoke(classObj.newInstance());

那么問題就來了
我弄了一個只裝有Spawn.class的jar包, 包名 cc.zoyn.spawn

  • 當(dāng)Spawn類繼承Module(主Jar里的一個類),出現(xiàn)以下報(bào)錯
    圖片描述

圖中的報(bào)錯

at cc.zoyn.minebasic.MineBasic.loadModules(MineBasic.java.124) 對應(yīng)過來的代碼為 Class<?> spawnClass = Class.forName("cc.zoyn.spawn.Spawn");

  • 當(dāng)Spawn類不繼承Module時,不報(bào)錯
    圖片描述

那這樣就不科學(xué)啊,去查了相關(guān)資料,還cv了別人的代碼,也去問了別人(說 可能和加載器不同有關(guān) ),但還是不行,已經(jīng)困擾了我很久
希望能有大佬解答
完整代碼: https://github.com/602723113/...

回答
編輯回答
忠妾

只需要把ModuleClassLoader里的 classLoader 指向 主類的ClassLoader即可

private static URLClassLoader classLoader = MineBasic.class.getClassLoader();
2017年9月12日 01:04