最近在公司的項目裏看到了ServiceLoader這個類,就好奇地去了解了一下。我們都知道,根據一個類去找它的父類或者接口那很簡單。畢竟類加載的時候,相關信息都加載進去了。但反過來就不簡單了,那就是根據接口去找所有實現類。
這個類主要作用就是加載某個接口的實現類。類似的功能,我以前用註解的形式實現過。就是掃描包,然後根據註解信息判斷是否是某個類的子類,然後進行加載。
但這顯然是個不大好的方法,因爲掃描包成本高嘛,所以jdk就提供了這麼一個工具類,java.util.ServiceLoader。
其實這個類實現也很簡單,
private static final String PREFIX = "META-INF/services/";
他定義了這麼一個路徑,你只需要去該路徑下配置相關信息就行。那配置的是啥呢,也很簡單,那就是接口和實現類的全類名。
文件名就是接口全類名,沒有後綴。
裏面的內容就是實現類的全類名:
com.app.test.FaceImpl0
com.app.test.FaceImpl1
Face.java
package com.app.test;
/**
* Created by Tim on 2017/7/11.
*/
public interface Face {
void doSome();
}
FaceImpl0.java
package com.app.test;/**
* Created by Tim on 2017/7/11.
*/
/**
* create by 陳樟傑
*/
public class FaceImpl0 implements Face {
@Override
public void doSome() {
System.out.println("實現類---0");
}
}
FaceImpl1.java
package com.app.test;/**
* Created by Tim on 2017/7/11.
*/
/**
* create by 陳樟傑
*/
public class FaceImpl1 implements Face {
@Override
public void doSome() {
System.out.println("實現類---1");
}
}
JavaTest.java
package com.app.test;/**
* Created by Tim on 2017/7/11.
*/
import java.util.ServiceLoader;
/**
* create by 陳樟傑
*/
public class JavaTest {
public static void main(String[] args) {
ServiceLoader<Face> serviceLoader = ServiceLoader.load(Face.class);
for(Face face:serviceLoader) {
face.doSome();
}
}
}
運行結果:
實現類---0
實現類---1
這個類實現了迭代器,所以遍歷時非常簡單。
public final class ServiceLoader<S>
implements Iterable<S>
版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/JobsandCzj/article/details/74985294