0

プラグインを動的にロードしています。プラグインとソフトウェアの両方が私たちによって作成されました。

私はそれをFooと呼ぶことができるインターフェースを持っています。そのメソッドを実装するだけのFooImplもありますが、FooImplは動的にロードされたjarにあります public interface Foo { void write(..someArgument..) throws Exception; }

PluginLoaderクラスもあります。ここにメソッドがあります

 public
Object loadPlugin(final String jarPath, final Class
pluginInterface) {
    try
    {
        final URI uri = new File(jarPath).toURI();
        final URL url = uri.toURL();

final URLClassLoader ucl = new URLClassLoader(new URL[] { url }); try { final Class<?> pluginClass = Class.forName("FooImpl", true, ucl); // Verify if plugin implements plugin interface. if (pluginClass.getInterfaces()[0].getName().equals(pluginInterface.getName())) { // Instantiate plugin. return pluginClass.newInstance(); } }//[...] </code></pre>

この部分は実際にはうまく機能していると思います。pluginClassでsysoutを実行した後、次
のことに気付きます。.getMethods()=
[public void FooImpl.write(.. someArgumentType ..)は例外をスローし、public abstract void some.package.Foo .write(.. someArgumentType ..)は例外をスローします]

.getGenericInterfaces()= [interface some.package.Foo]

しかし、メソッドwriteを呼び出そうとすると、
java.lang.AbstractMethodError:FooImpl.write(.. SomeArgumentType ..;)V
が表示されます。なぜ「;」があるのか​​わかりません。と「V」

つまり、基本的には、実装されたメソッドではなく、インターフェイスメソッドを呼び出そうとしていると思います。だから私は何が起こっているのだろうと思っています!

いつものように、お時間を割いてご協力いただきありがとうございます

4

1 に答える 1

0

AbstractMethodErrorは、コードが最初に構築されたクラスとは異なるバージョンのクラスを実行時に使用しようとしていることを示しています。実行環境で、クラスパスに不正なバージョンのインターフェイス実装がないことを確認する必要があります。

于 2012-08-17T15:31:56.610 に答える