java.util.serviceloader使用

java.util.serviceloader使用

ID:8814611

大小:247.00 KB

页数:11页

时间:2018-04-08

java.util.serviceloader使用_第1页
java.util.serviceloader使用_第2页
java.util.serviceloader使用_第3页
java.util.serviceloader使用_第4页
java.util.serviceloader使用_第5页
资源描述:

《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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。