[JAVA]ServiceLoader类学习

ServiceLoader类是从1.6版本以后出现的,它实现了Iterable<S>接口。
它可以使得使用者通过配置文件来获得想要的子类。这一点是非常棒的。Hadoop的FileSystem类的中就使用了该类。
我们看一个例子来学习ServiceLoader这个类。

抽象类
package test;

public abstract class testServiceLoader {
public abstract void say();
}

子类HEHE:
package test;

public class HEHEtestServiceLoader extends testServiceLoader{

@Override
public void say() {
// TODO Auto-generated method stub

System.out.println("HEHE");

 }
}

子类HAHA:
package test;

public class HAHAtestServiceLoader extends testServiceLoader{

@Override
public void say() {
// TODO Auto-generated method stub

System.out.println("HAHA");

}
}

这个时候,在src目录下新建个目录META-INF/services,再在这个新建的文件夹下新建一个文件,命名应是抽象类或者接口的全部名字。本例中,新建文件名  test. testServiceLoader,里面写上内容:
#需要加载的子类
test.HAHAtestServiceLoader
test.HEHEtestServiceLoader

编写main函数进行测试:
package test;

import java.util.ServiceLoader;

public class Main {
public static void main(String[] args) {
ServiceLoader<testServiceLoader> sl = ServiceLoader

.load(testServiceLoader.class);



for(testServiceLoader tsl: sl){

tsl.say();


}

}
}

运行之,发现配置文件中子类的say方法都被调用,OK。

JDK文档中还提到了该类有reload()方法。该方法用于清楚加载器的缓存,并重新加载。其实ServiceLoader类最为重要的还是load()方法。

对该类的思考:在阅读Hadoop源码过程中,感觉到使用该类可以有更好的扩展性。这样,仅仅需要更改配置文件即可。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值