java.util.ServiceLoader
まぁJavaやってるとたまーにみるMETA-INF/servicesっていうディレクトリにファイルがあってその中身が実装クラスのFQDNが書いてるっていうケース。こういう仕組みを作るにはどうするのかっていうのをやってみた
ServiceLoaderで処理される側な部分
つまりMETA-INF/servicesに記載する部分。まずservices内にあるファイル名はインターフェース名な模様。なのでインターフェースを作る
package sample;
public interface Sample {
String say();
}
っていう感じで作ればMETA-INF/services/sample.Sampleっていうファイルを作って中身にはそのインターフェースを実装したクラスのFQDNを書けば良い。今回はsample.SampleImplって感じにしておいた。まぁjar tvfすると
0 Mon Dec 16 13:15:16 JST 2013 sample/ 388 Mon Dec 16 13:15:16 JST 2013 sample/SampleImpl.class 137 Mon Dec 16 13:15:16 JST 2013 sample/Sample.class 0 Mon Dec 16 13:09:50 JST 2013 META-INF/services/ 18 Mon Dec 16 13:09:50 JST 2013 META-INF/services/sample.Sample
っていう感じになる。んでこれを使う
ServiceLoaderを使う
まぁ上記で生成したjarファイルをビルドパスに入れてと
import java.util.ServiceLoader;
import sample.Sample;
public class Main {
public static void main(String[] args) {
ServiceLoader<sample> loader = ServiceLoader.load(Sample.class);
for (Sample sample : loader) {
System.out.println(sample.getClass());
System.out.println(sample.say());
}
}
}
っていう感じでjava.util.ServiceLoaderを使う事で、META-INF/servicesで定義されているインターフェースで取得しその実装を利用する事が出来る感じかと