ServiceLoaderでプラグインの仕組みをさくっと作る。
ServiceLoaderを使うと、リソースを使ったプラグインの仕組みをさくっと作成できます。
- サービスインターフェイスと実装を作り、
- jar内の「META-INF/services/<サービスインターフェイスのクラス名>」にサービス構成ファイルを作成、実装クラスを並べておきます。
- 後は、「ServiceLoader.load()」を実行すれば、リソースに書かれた実装クラスのインスタンスが取得可能。
ということで、以下はServiceLoaderを使ってみるサンプルです。
サービスインターフェイス (test/Kitten.java):
package test; public interface Kitten { void meow(); }
サービスの実装x3 (test/Mii.java,test/Shiro.java,test/Tora.java) :
package test; public class Mii implements Kitten{ public void meow () { System.out.println( "mii : meow!" ); } }
package test; public class Shiro implements Kitten{ public void meow () { System.out.println( "shiro : meow!" ); } }
package test; public class Tora implements Kitten{ public void meow () { System.out.println( "tora : meow!" ); } }
サービス構成ファイル (META-INF/services/test.Kitten) :
test.Mii test.Tora test.Shiro
サービスを取り出すサンプル。
// 登録されている Kitten の実装を列挙する。 for( Kitten k : ServiceLoader.load( Kitten.class ) ) { k.meow(); }
実行結果です。
mii : meow! tora : meow! shiro : meow!
昔、DOMパーザーの仕組みを調べつつ自前で実装した記憶がありますが、最近は標準のAPIでサポートされてるんですねー。便利になったものだ。