同じタイプの異なるデバイスに接続するプロジェクトに取り組んでいます。単一のデバイス用にいくつかのクラスを実装しましたが、すべての「ドライバー」が実装する必要がある汎用インターフェイスを開発しました。
私の問題は次のとおりです。後で、ユーザーはGUIを介して私のプログラムを使用し、私から提供されたドライバーを「ロード」できるはずです。しかし、これらのドライバーはどのように見えますか? ドライバー インターフェイスを実装するクラスを含む .jar? 何をすべきかを大まかに記述したxmlファイル?
次の投稿を出発点と見なすことができます:https ://stackoverflow.com/a/2575156/471129
基本的に、依存性の注入と制御の反転は、外部で構成を指定し、さまざまな.jarファイルからコードを動的にロードするために使用されます。これはあなたがやろうとしていることのようです。
もちろん、次のようなクラス名でコードをいつでもロードできます。
public interface IPlugin {
// some methods that all the plugins will have in common
}
private static IPlugin loadIPluginByClassName(String plugInClassName, ClassLoader classLoader) {
// NOTE: throws NoClassDefFoundError or ClassNotFoundException if cannot load the class
// or throws ClassCastException if the loaded class does not implement the interface
Class<?> cls = classLoader.loadClass(plugInClassName);
IPlugin ans = (IPlugin) cls.newInstance()
return ans;
}
次のように、パッケージ修飾クラス名とクラスローダーを使用してloadIPluginByClassName()を呼び出す必要があります。
IPlugin pi = loadIPluginByClassName("com.test.something.MyPlugin", SomeClassInYourProject.class.getClassLoader());
プラグインは、その.jarがクラスパス上にある限り、独自の.jarに含めることができます。
外部の.jarからそれらをロードしたくない場合は、より単純なものを使用できます。
IPlugin pi = loadIPluginByClassName(MyPlugin.class.getName(), SomeClassInYourProject.class.getClassLoader());
これにより、プラグインクラスへの直接参照が作成されます(参照として見つけることができるという点で役立ちます)。