简单的介绍:public final class ServiceLoader<S>extends Object implements Iterator<S>一个简单的服务提供者加载设施用于从配置文件中加载子类或者接口的实现类
主要是从META-INF/service这个目录中的配置文件,读取文件的内容,然后加载给定接口或者基类的相关的实现
具体的工作流程:ServiceLoader会根据给定的类的全名称(包含包名以及类的名称),然后在META-INF/services下面找到和类全名称的名称相同对应的文件,在这个文件中定义了这个类的子类,返回相应的子类的实例
具体的例子:
package com.tan
public interface IDiagramPlugin extends AbstractPlugin
{
public abstract String getName();
public abstract String getCategory();
}
package com.horstmann.violet.product.diagram.uppaal;
public class MarkovPlugin implements IDiagramPlugin
{
@Override
public String getName()
{
return“”markov“”;
}
@Override
public String getCategory()
{
return "static";
}
}
public class UppaalPlugin implements IDiagramPlugin
{
@Override
public String getName()
{
return"uppaal";
}
@Override
public String getCategory()
{
return "static";
}
}
配置文件 在META-INF/services下面文件的名称 com.tan.IDiagramPlugin(.properties)
文件的内容
com.tan.MarkovPlugin
com.tan.UppaalPlugin
测试的代码
public class Test {
public static void main(String[] args) {
ServiceLoader<IDiagramPlugin> serviceLoader=ServiceLoader.load(IDiagramPlugin.class);
for(IDiagramPlugin service:serviceLoader){
System.out.println(service.getName()+"--"+service.getCategory());
}
}
}
输出的结果:markov--static
uppaal--static
总结:通过规范规定的接口或者超类,然后通过全名的配置文件名称在项目中找到,然后通过配置文件中的全名找到相应的子类,分别实例找到相应的属性输出,
通过ClassLoader完全可以自己读取相应的配置文件(实现了一些常用的框架的功能)