0

我尝试在 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。

有人有想法吗?

谢谢

4

1 回答 1

3

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

于 2012-04-19T10:23:51.300 回答