【问题标题】:ClasscastException in servletservlet 中的 ClasscastException
【发布时间】:2012-04-19 18:23:51
【问题描述】:

我尝试在 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);
        }

这个初始化url:



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

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

有人有想法吗?

谢谢

【问题讨论】:

    标签: java servlets classcastexception


    【解决方案1】:

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

    【讨论】:

    • 我理解您的解释,但为什么当我在 java 标准应用程序中尝试此代码时它正在工作?
    • 在标准的 Java 应用程序中,默认的类加载器完全不同,所以我认为它的工作是由于这两个 cls 之间的幸运交互 - 或者由于 servlet 中的不幸配合而无法工作容器案例:) 您没有将显式父类加载器传递给URLClassloader。在这种情况下,父母会是什么?
    • 感谢您的解释非常有帮助,就像您说在 URLClassloader 处传递默认类加载器解决了问题一样。祝你有美好的一天
    • 很高兴接受这个答案,scarankle,如果你认为它有帮助的话。只是 StackOverlow 礼仪。
    猜你喜欢
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 2012-06-25
    • 2019-05-12
    • 2014-04-09
    • 2017-12-05
    • 1970-01-01
    相关资源
    最近更新 更多