0
我尝试在servlet中实现插件系统。我写了一个类来加载使用URLClassLoader加载jar文件和Class.forname加载类的插件。
这里是我的代码:
这部分创建URL类装载器:
Servlet中的ClasscastException
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);
}
这一个初始化的网址:
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());
}
}
我已经设法创建对象,因为我可以n操作它并检索它实现的接口,但是我不能在ITest中将它投射到应用程序中进行操作。我有一个ClassCastException tplugin.toto.Toto不能转换为fr.test.inter.ITest。
很奇怪,因为Toto实现了ITest。
有没有人有想法?
感谢
我理解你的解释,但为什么当我在java标准应用程序中尝试这段代码时,它正在工作? – scarankle 2012-04-19 10:31:14
在一个标准的Java应用程序中,默认的类加载器是完全不同的,所以我认为它的工作原因是因为这两个CLS之间有一个幸运的交互作用 - 或者由于在servlet容器的情况下不合适而不工作:)你不是传递一个明确的父类加载器到'URLClassloader'。在这种情况下,父母是什么? – 2012-04-19 10:36:57
感谢你的解释是非常有帮助的,就像你说的在URLClassloader中传递默认类加载器来解决问题一样。祝你有个愉快的日子 – scarankle 2012-04-19 10:50:11