我写了我的类加载器:
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();
}
}
}
线程中的异常" main" java.lang.NoClassDefFoundError: plugin / PluginImpl(错误的名字: ru / sberbank / school / homework8 / plugin / PluginImpl)at java.lang.ClassLoader.defineClass1(本机方法)
我得到NoClassDefFoundError。为什么???我该如何解决?
请帮帮我!
package ru.sberbank.school.homework8.plugin;
public class PluginImpl implements Plugin {
@Override
public void doUseful() {
System.out.println("My plugin!");
}
}
答案 0 :(得分:0)
您收到此错误是因为您没有提供类的正确FQN,实际上在您的load
方法中,您尝试找到与pluginName + "." + pluginClassName
对应的类,这将在您的情况下{ {1}}但您的班级plugin.PluginImpl
的套餐名称实际为PluginImpl
,因此您班级的真实FQN为ru.sberbank.school.homework8.plugin
。
要解决此问题,您需要替换:
ru.sberbank.school.homework8.plugin.PluginImpl
使用:
Plugin plugin = pluginManager.load("plugin", "PluginImpl");
或者您可以修改方法Plugin plugin = pluginManager.load("ru.sberbank.school.homework8.plugin", "PluginImpl");
以添加前缀,假设您将始终从同一个根包中检索插件:
load