Javaに限らずなのですが、今回、私が利用しようとしている言語が
Javaなのでこちらに投稿させて頂きました。
ソフトウェアで、よくプラグイン式のものを見かけます。
フリーウェアで言えばEclipse、GPLライセンスのWebツールなら
XOOPS、MovableTypeなど(ちょっとイメージ違うかもしれませんが)。
そういったプラグイン式のアプリケーションを作成するには
一体どうしたら良いのでしょうか?
考えてはみたものの、方法が見つかりません。
1.ディレクトリ走査でファイルを探査?
めちゃくちゃ時間かかりそうな予感。
2.見つけたとしてもどうやってメインプログラムから呼び出すのか?
そのファイルがある時もない時も可能性がある。
勿論、プラグインの作成方法は固定であったとしても、
やはりどう呼び出すのか見当も付きません。
どなたかご教示願います。
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();
}
}
ありがとうございます。
interfaceってこういう時に使うんですねーー。
使い道があんまり分からなくて気にしていませんでした^^;
No.1
- 回答日時:
基本的にはディレクトリ内の特定のファイルからプラグインの情報(プラグイン用インターフェースを実装したクラスなど)を取得します。
その情報を元に動的にクラスやモジュールを読み込みます。
Javaの場合はClassLoaderを使って動的にクラスを読み込みます。
詳しい実装方法などはEclipseのソースやJDKに付属しているJavaのソースを参考にしてみれば良いと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- WordPress(ワードプレス) Wordpress 複数プラグインの不具合? 1 2022/10/09 21:52
- その他(インターネット接続・インフラ) 語学レッスン予約ページを作ろうとしています。 1 2022/09/26 17:43
- WordPress(ワードプレス) 「あるサイトのリンクを踏まないと、次のサイトを見れない仕組み」を作りたい 2 2022/07/20 02:43
- HTML・CSS 使用しているプラグインの自動表記リンクを目立たなくする方法はありますか? 1 2022/07/15 19:00
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- WordPress(ワードプレス) Wordpressの投稿記事に関する公開ワークフローについて 1 2023/02/17 11:29
- UNIX・Linux ubuntuのサーバー(virtual box)が、再起動するとデータが消えてしまいます。 4 2022/04/27 21:29
- HTML・CSS ホームページのHTMLサイトマップを自動作成する方法を探しています。 1 2023/05/17 21:36
- WordPress(ワードプレス) ワードプレスのパーマリンク設定について 1 2023/02/11 19:08
- WordPress(ワードプレス) ワードプレスのバージョン 2 2022/06/12 09:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c++,ある関数のクラスから別の...
-
クラス間でのデータ参照
-
java-別クラスの変数の使い方を...
-
Java リフレクションについて
-
C++でfriendクラスにしているの...
-
範囲外の数値を代入したらエラ...
-
C#でほかのファイルにある自作...
-
リフレクション
-
SwingでgetContentPaneのエラー...
-
リレーションエンティティクラ...
-
C++ クラス名の前のdefine
-
Java
-
関数内の変数に<summary>コメン...
-
スーパークラスのコンストラク...
-
C#のクラスライブラリでメッセ...
-
整数値を任意のオブジェクトを...
-
親クラスから子クラスへアクセス。
-
違うクラスからの変数の共有化
-
C#にて別クラスの関数を使いたい
-
構造 他のクラスの構造体を別...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
クラス間でのデータ参照
-
c++,ある関数のクラスから別の...
-
範囲外の数値を代入したらエラ...
-
C#にて別クラスの関数を使いたい
-
C#でほかのファイルにある自作...
-
C++でfriendクラスにしているの...
-
java-別クラスの変数の使い方を...
-
親クラスから子クラスへアクセス。
-
構造 他のクラスの構造体を別...
-
ひとつのファイルにクラスは1つ?
-
Java
-
import と extends について
-
継承したクラス側のクラス名の取得
-
SwingでgetContentPaneのエラー...
-
Java リフレクションについて
-
C#のクラスライブラリでメッセ...
-
アップキャスト、ダウンキャス...
-
C# インターフェイスの実装
-
visual studioのデザイナ画面で...
おすすめ情報