获得接口的实现类有点困难
在Java中,由于反射的局限性,无法直接获取一个接口的所有实现子类,所以为了能够实现一个接口动态的注入实现的子类对象,需要借助ServiceLoader
简单的Demo使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| public interface IService { void doSomeThing(); }
public class DefalutService implements IService{ @Override public void doSomeThing() { RzLogger.info("默认服务"); } }
public class LogService implements IService { @Override public void doSomeThing() { RzLogger.info("日志服务"); } }
public static void main(String[] args) { ServiceLoader<IService> loader = ServiceLoader.load(IService.class); for (IService service : loader) { service.doSomeThing(); } }
|
如果直接运行,可以发现没有任何结果,需要在META-INF\services
创建一个文件xxx.xxx.IService
(是接口类的全类名) ,内容是两个子类的全类名:
1 2
| learnJava.rz08.DefalutService learnJava.rz08.LogService
|
再次运行结果:
1 2
| 21:55:48,873 INFO [main] (RzLogger.java:12) - 默认服务 21:55:48,877 INFO [main] (RzLogger.java:12) - 日志服务
|