プロが教える店舗&オフィスのセキュリティ対策術

Javaに限らずなのですが、今回、私が利用しようとしている言語が
Javaなのでこちらに投稿させて頂きました。

ソフトウェアで、よくプラグイン式のものを見かけます。
フリーウェアで言えばEclipse、GPLライセンスのWebツールなら
XOOPS、MovableTypeなど(ちょっとイメージ違うかもしれませんが)。

そういったプラグイン式のアプリケーションを作成するには
一体どうしたら良いのでしょうか?
考えてはみたものの、方法が見つかりません。

1.ディレクトリ走査でファイルを探査?
  めちゃくちゃ時間かかりそうな予感。
2.見つけたとしてもどうやってメインプログラムから呼び出すのか?
  そのファイルがある時もない時も可能性がある。

勿論、プラグインの作成方法は固定であったとしても、
やはりどう呼び出すのか見当も付きません。

どなたかご教示願います。

A 回答 (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();
}
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/02/09 12:18

基本的にはディレクトリ内の特定のファイルからプラグインの情報(プラグイン用インターフェースを実装したクラスなど)を取得します。


その情報を元に動的にクラスやモジュールを読み込みます。
Javaの場合はClassLoaderを使って動的にクラスを読み込みます。

詳しい実装方法などはEclipseのソースやJDKに付属しているJavaのソースを参考にしてみれば良いと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!