欢迎来到天天文库
浏览记录
ID:8814611
大小:247.00 KB
页数:11页
时间:2018-04-08
《java.util.serviceloader使用》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、java.util.ServiceLoader使用今天在看Hadoop源代的时候发现,在FileSystem中用到了java.util.ServiceLoader这个类来从配置文件中加载子类或者接口的实现类。以前从来没有使用过这个类,进去大概看了一下具体的实现。主要是从META-INF/services这个目录下的配置文件加载给定接口或者基类的实现,ServiceLoader会根据给定的类的fullname来在META-INF/services下面找对应的文件,在这个文件中定义了所有这个类的子类或者
2、接口的实现类,返回一个实例。下面以一个具体的例子来说明一下ServiceLoader的具体使用,类似HadoopFileSystem中的实现。首先定义一个接口,具体如下:publicinterfaceIService{ publicStringsayHello(); publicStringgetScheme(); } 该接口有两个子类,分别为HDFSService和LocalService:publicclassHDFSServiceimplementsIService{
3、 @Override publicStringsayHello(){ return"HelloHDFS!!"; } @Override publicStringgetScheme(){ return"hdfs"; } } publicclassLocalServiceimplementsIService{ @Override publicStringsayHello(){ return"HelloLocal!!
4、"; } @Override publicStringgetScheme(){ return"local"; } } 需要在META-INF/services下以IService这个类的全名来新建立一个文件,文件中的内容为两个实现类的全名,如下:org.hadoop.java.HDFSService org.hadoop.java.LocalService 所有的实现和配置都已经完成,下面写一个测试类来看一下结果:PublicclassServiceLo
5、aderTest{ publicstaticvoidmain(String[]args){ //needtodefinerelatedclassfullnamein/META-INF/services/.... ServiceLoaderserviceLoader=ServiceLoader .load(IService.class); for(IServiceservice:serviceLoader){ System.o
6、ut.println(service.getScheme()+"="+service.sayHello()); } } } 具体的输出来如下:hdfs=HelloHDFS!! local=HelloLocal!! 可以看到ServiceLoader可以根据IService把定义的两个实现类找出来,返回一个ServiceLoader的实现,而ServiceLoader实现了Iterable接口,所以可以通过ServiceLoader来遍历所有在配置文件中定义的类的实例。Hadoop Fil
7、eSystem就是通过这个机制来根据不同文件的scheme来返回不同的FileSystem。FileSystem中的相关实例如下:privatestaticvoidloadFileSystems(){ synchronized(FileSystem.class){ if(!FILE_SYSTEMS_LOADED){ ServiceLoaderserviceLoader=ServiceLoader.load(FileSystem.class); for
8、(FileSystemfs:serviceLoader){ SERVICE_FILE_SYSTEMS.put(fs.getScheme(),fs.getClass()); } FILE_SYSTEMS_LOADED=true; } } } FileSystem对应的配置如下:org.apache.hadoop.fs.LocalFileSystem org.apache.hadoop.fs.viewfs.ViewFileSyste
此文档下载收益归作者所有