java.util.ServiceLoader使用

2014-11-24 09:07:27 · 作者: · 浏览: 1

下面以一个具体的例子来说明一下ServiceLoader的具体使用,类似Hadoop FileSystem中的实现。


首先定义一个接口,具体如下:


public interface IService {
public String sayHello();

public String getScheme();
}


该接口有两个子类,分别为HDFSService和LocalService:


public class HDFSService implements IService {

@Override
public String sayHello() {
return "Hello HDFS!!";
}

@Override
public String getScheme() {
return "hdfs";
}
}



public class LocalService implements IService {

@Override
public String sayHello() {
return "Hello Local!!";
}

@Override
public String getScheme() {
return "local";
}

}


需要在META-INF/services下以IService这个类的全名来新建立一个文件,文件中的内容为两个实现类的全名,如下:


org.hadoop.java.HDFSService
org.hadoop.java.LocalService


所有的实现和配置都已经完成,下面写一个测试类来看一下结果:


public class ServiceLoaderTest {

/**
* @param args
*/
public static void main(String[] args) {
//need to define related class full name in /META-INF/services/....
ServiceLoader serviceLoader = ServiceLoader
.load(IService.class);
for (IService service : serviceLoader) {
System.out.println(service.getScheme()+"="+service.sayHello());
}
}

}