我写了我的类加载器:
package ru.sberbank.school.homework8;
import ru.sberbank.school.homework8.plugin.Plugin;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class PluginManager extends ClassLoader {
private final String pluginRootDirectory;
public PluginManager(String pluginRootDirectory) {
this.pluginRootDirectory = pluginRootDirectory;
}
public Plugin load(String pluginName, String pluginClassName) {
String name = pluginName + "." + pluginClassName;
try {
Class clazz;
try {
clazz = super.findSystemClass(name);
} catch (ClassNotFoundException e) {
String fileName = pluginRootDirectory + "\\" + pluginName + "\\" + pluginClassName + ".class";
try (FileInputStream fin = new FileInputStream(fileName)) {
byte[] buffer = new byte[(int) (new File(fileName).length())];
fin.read(buffer);
clazz = defineClass(name, buffer, 0, buffer.length);
}
}
return (Plugin)clazz.newInstance();
} catch (IOException | InstantiationException | IllegalAccessException ignored) {
return null;
}
}
}
当我运行它时:
package ru.sberbank.school.homework8;
import ru.sberbank.school.homework8.plugin.Plugin;
public class PluginManagerTest {
public static void main(String[] args) {
String pluginRootDirectory = "D:\\sbt\\target\\classes\\ru\\sberbank\\school\\homework8";
PluginManager pluginManager = new PluginManager(pluginRootDirectory);
Plugin plugin = pluginManager.load("plugin", "PluginImpl");
if (plugin != null) {
plugin.doUseful();
}
}
}
线程“主要” java.lang.NoClassDefFoundError中的异常:java.lang.ClassLoader.defineClass1(本机方法)上的plugin / PluginImpl(错误名称:ru / sberbank / school / homework8 / plugin / PluginImpl)
我收到NoClassDefFoundError。为什么???我该如何解决???
请帮帮我!
package ru.sberbank.school.homework8.plugin;
public class PluginImpl implements Plugin {
@Override
public void doUseful() {
System.out.println("My plugin!");
}
}
因为没有提供正确的类的FQN,所以会收到此错误,确实是在您的load
方法中,您尝试找到pluginName + "." + pluginClassName
与之对应的类,plugin.PluginImpl
但是您的类的包名称PluginImpl
实际上ru.sberbank.school.homework8.plugin
是真正的FQN您的班级是ru.sberbank.school.homework8.plugin.PluginImpl
。
要解决此问题,您需要替换:
Plugin plugin = pluginManager.load("plugin", "PluginImpl");
和:
Plugin plugin = pluginManager.load("ru.sberbank.school.homework8.plugin", "PluginImpl");
或者,您可以修改方法load
以添加前缀,前提是您始终将始终从同一根包中检索插件:
public Plugin load(String pluginName, String pluginClassName) {
String name = "ru.sberbank.school.homework8." + pluginName + "." + pluginClassName;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句