2012-04-19 31 views
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&ltpluginName.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。

有没有人有想法?

感谢

回答

3

你已经创建了一个classoader问题 - 当你与instanceof ITest测试,您使用的是由默认的类加载器加载ITest的副本,但您正在测试由URLClassloader加载一个实例。该类加载器已加载自己的副本ITest,就JVM而言,它是完全不同的类型。

+0

我理解你的解释,但为什么当我在java标准应用程序中尝试这段代码时,它正在工作? – scarankle 2012-04-19 10:31:14

+0

在一个标准的Java应用程序中,默认的类加载器是完全不同的,所以我认为它的工作原因是因为这两个CLS之间有一个幸运的交互作用 - 或者由于在servlet容器的情况下不合适而不工作:)你不是传递一个明确的父类加载器到'URLClassloader'。在这种情况下,父母是什么? – 2012-04-19 10:36:57

+0

感谢你的解释是非常有帮助的,就像你说的在URLClassloader中传递默认类加载器来解决问题一样。祝你有个愉快的日子 – scarankle 2012-04-19 10:50:11

相关问题