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