java urlclassloader 动态加载jar包时出现ClassNotFound

我想给程序做一个加载外部jar的功能,在查阅相关资料后我了解到可以重写URLClassLoader做到

所以我仿照网上的教程编写了下方的代码

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();

}

}

}

调用部分

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

  • 当Spawn类继承Module(主Jar里的一个类),出现以下报错
    图片描述

图中的报错

at cc.zoyn.minebasic.MineBasic.loadModules(MineBasic.java.124) 对应过来的代码为 Class<?> spawnClass = Class.forName("cc.zoyn.spawn.Spawn");

  • 当Spawn类不继承Module时,不报错
    图片描述

那这样就不科学啊,去查了相关资料,还cv了别人的代码,也去问了别人(说 可能和加载器不同有关 ),但还是不行,已经困扰了我很久
希望能有大佬解答
完整代码: https://github.com/602723113/...

回答:

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

private static URLClassLoader classLoader = MineBasic.class.getClassLoader();

以上是 java urlclassloader 动态加载jar包时出现ClassNotFound 的全部内容, 来源链接: utcz.com/p/176342.html

回到顶部