ちょっと面白そうだったので、簡単なサンプルを作ってみました。
これは、Sampleクラスと同じ場所にあるプラグイン・クラスを読み込んで実行するサンプルです。プラグインは、MyPluginInterfaceをimplementsしたクラスとして作ります。Sampleは、起動時に、同じディレクトリ内にあるMyPluginInterface実装クラスを検索し、そこにあるプラグイン機能の実装メソッドdoPluginを実行します。
ここではサンプルとしてTestPluginClassというのを作ってありますが、実際にimplements MyPluginInterfaceしたクラスを作って配置してみてください。それらをすべて自動的に読み込んで実行するはずです。
まぁ、実際にはプラグインはJARになっていたり、所定のディレクトリに保管したり、メニューなどに組み込んで必要に応じて実行するようになっていたりするでしょうが、「特定の場所から、プラグイン用のインターフェイスを実装したクラスを探し出し、そこからメソッドを呼び出してプラグインを実行する」ということの基本はこんな感じで作れると思います。
// メインプログラム。
import java.io.*;
public class Sample {
public static void main(String[] args) {
String dir = System.getProperty("user.dir");
try {
File f = new File(dir);
String[] files = f.list();
for (int i = 0; i < files.length; i++) {
if (files[i].endsWith(".class")){
String classname = files[i].substring(0,files[i].length() - ".class".length());
Class c = Class.forName(classname);
System.out.println("CHECK: " + classname);
Class[] ifs = c.getInterfaces();
for(int j = 0; j < ifs.length; j++){
System.out.println("\tCHECK: " + ifs[j]);
if (ifs[j].equals(MyPluginInterface.class)){
System.out.println("**this is MyPlugin**");
MyPluginInterface plugin = (MyPluginInterface)c.newInstance();
plugin.doPlugin(); // プラグインの機能実行
}
}
}
}
} catch(Exception ex){}
System.out.println("END.");
}
}
// プラグイン用インターフェイス
interface MyPluginInterface {
public void doPlugin();
}
// サンプルのプラグイン・クラス
class TestPluginClass implements MyPluginInterface {
public void doPlugin(){
System.out.println("******TestPluginClass******");
System.out.println("doPlugin start!");
System.out.println();
System.out.println("これは、TestPluginClassを実行したものです。");
System.out.println();
System.out.println("******TestPluginClass******");
System.out.println();
}
}
お礼
ありがとうございます。 interfaceってこういう時に使うんですねーー。 使い道があんまり分からなくて気にしていませんでした^^;