0

プラグインシステムをサーブレットに実装しようとしています。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でキャストしてアプリケーションで操作することはできません。ClassCastExceptiontplugin.toto.Totoをfr.test.inter.ITestにキャストできません。
TotoがITestを実装しているので不思議です。

誰かアイデアがありますか?

ありがとう

4

1 に答える 1

3

You've created a classoader issue -- when you test with instanceof ITest, you are using the copy of ITest loaded by the default classloader, but you are testing an instance loaded by the URLClassloader. That classloader has loaded its own copy of ITest, which, as far as the JVM is concerned, is a completely different type.

于 2012-04-19T10:23:51.300 に答える