servlet中的ClasscastException

时间:2012-04-19 10:01:03

标签: java servlets classcastexception

我尝试在servlet中实现插件系统。我编写了一个加载插件的类,使用URLClassLoader加载jar文件,使用Class.forname加载类。
这是我的代码:
这部分创建了url类Loader:



    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());
            }
        }

我已经设法创建了对象,因为我可以操作它并检索它实现的接口,但是我无法在ITest中将其强制转换为在应用程序中操作它。我有一个ClassCastException tplugin.toto.Toto无法强制转换为fr.test.inter.ITest。
这很奇怪,因为Toto实现了ITest。

有没有人有想法?

由于

1 个答案:

答案 0 :(得分:3)

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