• JAVA如何获取一个接口的所有实现子类?
  • 发布于 2个月前
  • 267 热度
    0 评论

在Java中,由于反射的局限性,无法直接获取一个接口的所有实现子类,所以为了能够实现一个接口动态的注入实现的子类对象,需要借助ServiceLoader

简单的Demo使用
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) {
   // 堆代码 duidaima.com
    ServiceLoader < IService > loader = ServiceLoader.load(IService.class);
    for (IService service: loader) {
        service.doSomeThing();
    }
}
如果直接运行,可以发现没有任何结果,需要在META-INF\services创建一个文件xxx.xxx.IService(是接口类的全类名) ,内容是两个子类的全类名:
learnJava.rz08.DefalutService
learnJava.rz08.LogService
再次运行结果:
21:55:48,873  INFO [main] (RzLogger.java:12) - 默认服务
21:55:48,877  INFO [main] (RzLogger.java:12) - 日志服务


用户评论