プラグイン機構は、開発時点では、どんな機能が追加されるかわからないときに使います。 それを Java で実現する方法を整理しました。
ここでは例として、 好きな色をコンソールにプリントする というコードで、どの色が好きか(をプリントするか)は、プラグインで解決する という場合を考えます。
プラグインを作成する上で必要となるクラスを詰め込んだ base.jar を用意します。 また、そのプラグインを使うクラスも一緒に入れておきます。
base.jarの中には、以下の2つのクラスが入っています。
public interface IFavoriteColor{
String getColor();
}
import java.io.*;
import java.net.*;
public class PrintFavoriteColor {
private File jarFile;
private String className;
public PrintFavoriteColor(File jarFile,String className){
super();
this.jarFile=jarFile;
this.className=className;
}
public void print(){
try {
URL url = jarFile.toURL();
URLClassLoader loader = new URLClassLoader(new URL[]{url});
Class c = loader.loadClass(className);
Object obj = c.newInstance();
IFavoriteColor fc=(IFavoriteColor)obj;
System.out.println( " My favorite color is "+fc.getColor()+"." );
}
catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
if(args.length==2){
String jarFileName=args[0];
String className=args[1];
PrintFavoriteColor pfc = new PrintFavoriteColor(new File(jarFileName),className);
pfc.print();
}
}
}
$ javac -classpath base.jar IFavoriteColor.java PrintFavoriteColor.java
$ jar cf base.jar *.class
IFavoriteColorを実装した MyFavoriteColor クラスを作成し、mycolor.jar に詰めます。
public class MyFavoriteColor implements IFavoriteColor {
public String getColor(){
return "blue";
}
}
$ javac -classpath base.jar MyFavoriteColor.java
$ jar cf mycolor.jar *.class
$ java -cp base.jar PrintFavoriteColor mycolor.jar MyFavoriteColor
My favorite color is blue.
これでプラグインのしくみの基本はOKですが、このままでは、プラグインした jar (この例では mycolor.jar) に含まれている どのクラスを使えばいいのかを知らないとプラグインを使えない という致命的な問題があります。
これを改良して plugin 用の jar を追加しさえすれば使えるようにする方法は JavaでPluginを実現する方法(改良版) を参照してください。