• ベストアンサー

プラグイン式のツールを作成するには?

Javaに限らずなのですが、今回、私が利用しようとしている言語が Javaなのでこちらに投稿させて頂きました。 ソフトウェアで、よくプラグイン式のものを見かけます。 フリーウェアで言えばEclipse、GPLライセンスのWebツールなら XOOPS、MovableTypeなど(ちょっとイメージ違うかもしれませんが)。 そういったプラグイン式のアプリケーションを作成するには 一体どうしたら良いのでしょうか? 考えてはみたものの、方法が見つかりません。 1.ディレクトリ走査でファイルを探査?   めちゃくちゃ時間かかりそうな予感。 2.見つけたとしてもどうやってメインプログラムから呼び出すのか?   そのファイルがある時もない時も可能性がある。 勿論、プラグインの作成方法は固定であったとしても、 やはりどう呼び出すのか見当も付きません。 どなたかご教示願います。

質問者が選んだベストアンサー

  • ベストアンサー
noname#49664
noname#49664
回答No.2

ちょっと面白そうだったので、簡単なサンプルを作ってみました。  これは、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(); } }

naktak
質問者

お礼

ありがとうございます。 interfaceってこういう時に使うんですねーー。 使い道があんまり分からなくて気にしていませんでした^^;

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

基本的にはディレクトリ内の特定のファイルからプラグインの情報(プラグイン用インターフェースを実装したクラスなど)を取得します。 その情報を元に動的にクラスやモジュールを読み込みます。 Javaの場合はClassLoaderを使って動的にクラスを読み込みます。 詳しい実装方法などはEclipseのソースやJDKに付属しているJavaのソースを参考にしてみれば良いと思います。

すると、全ての回答が全文表示されます。

関連するQ&A