LoginSignup
0
0

More than 1 year has passed since last update.

ServiceLoader

Posted at

ServiceLoaderを使って、interfaceにclassをloadさせる
Provide-configurationにどのclassをloadするかを設定する

Hello.java
package sampleproject;

public interface Hello {
    public String hello();
}
HelloImple.java
package lib;
import sampleproject.Hello;

public class HelloImpl implements Hello {
    @Override
    public String hello() {
        return "Hello, SPI!";
    }
}
SampleProject.java
package sampleproject;

import java.util.Iterator;
import java.util.ServiceLoader;

public class SampleProject {
    public static void main(String[] args) {
        Iterator<Hello> hellos = ServiceLoader.load(Hello.class).iterator();
        while(hellos.hasNext()) {
            Hello h = hellos.next();
            System.out.println(h.hello());
        }
    }    
}

provider-configuration
sampleproject.Helloというinterfaceにlib.HelloImpleをセットすることを意味する

META-INF\services\sampleproject.Hello
lib.HelloImpl

provider-configurationもclass-pathに含めるために事前にjar化

C:\Users\java\Documents\NetBeansProjects\SampleProject>jar cvf impl.jar build\classes\META-INF\services\sampleproject.Hello build\classes\lib\HelloImpl.class
マニフェストが追加されました
build/classes/META-INF/services/sampleproject.Helloを追加中です(入=13)(出=15)(-15%収縮されました)
build/classes/lib/HelloImpl.classを追加中です(入=394)(出=263)(33%収縮されました)

C:\Users\java\Documents\NetBeansProjects\SampleProject>java -cp build\classes;impl.jar sampleproject.SampleProject
Hello, SPI!
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0