我尝试在 servlet 中实现插件系统。我编写了一个类来加载插件,它使用 URLClassLoader 来加载 jar 文件和 Class.forname 来加载类。
这是我的代码:
这部分创建 url 类加载器:
public PluginLoader(ServletContext context, String[] pluginName, String[] classToLoad) throws PluginLoaderException{
this.context = context;
urls= new URL[pluginName.length];
nameToURL(pluginName);
//create class loader
loader = new URLClassLoader(urls);
//loading the plug-in
loadPlugin(classToLoad);
}
这个初始化url:
private void nameToURL(String[] pluginName) throws PluginLoaderException{
try{
for(int i=0;i<pluginName.length;i++){
urls[i] = context.getResource(pluginName[i]);
}
}
最后这个创建对象:
private void loadPlugin(String[] classToLoad) throws PluginLoaderException{
try{
iTest = (ITest) Class.forName(classToLoad[0],true,loader).newInstance();
}
catch(Exception e){
throw new PluginLoaderException(e.toString());
}
}
我设法创建了该对象,因为我可以操作它并检索它实现的接口,但我不能将它转换为 ITest 以在应用程序中操作它。我有一个 ClassCastException tplugin.toto.Toto cannot be cast to fr.test.inter.ITest 。
很奇怪,因为 Toto 实现了 ITest。
有人有想法吗?
谢谢