プラグインを動的にロードしています。プラグインとソフトウェアの両方が私たちによって作成されました。
私はそれを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」つまり、基本的には、実装されたメソッドではなく、インターフェイスメソッドを呼び出そうとしていると思います。だから私は何が起こっているのだろうと思っています!
いつものように、お時間を割いてご協力いただきありがとうございます
質問する
281 次