查找实现特定接口的所有类

新手上路,请多包涵

我正在开发一个应用程序(Quartz 调度程序),我们有一个作业类负责实际执行工作,我们需要在 Quartz 调度程序中创建触发器时告知/传递作业类的名称。

我想为所有想要使用 API 的人提供一个扩展点(除了一些我将作为 API 的一部分提供的通用作业)。这个想法是创建一个(标记)接口,如果有人想将他们的类声明为调度程序作业类,他们所要做的就是(声明)实现该接口。

我不确定如何找到哪些类遵循合同(通过实现接口),以便我可以将它们显示给想要在调度程序中安排触发器的用户。

我的要求不是在运行时加载类,而是向用户显示实现所需接口的类列表,以便用户可以选择类并将类名传递给调度程序。它是 Quartz 调度器,它最终将负责创建一个类的实例。

任何人都可以建议我如何实现上述目标,或者有没有其他更好的方法来实现我想要做的事情?

编辑

我浏览了 ServiceLoader 的文档,似乎要实现一项服务,必须在 META-INF 文件夹中创建一个文件,其中包含实现类的名称,这让我想到,如果我的 API 的用户想要 20 个不同的实施时,他必须在文件中放入 20 个条目,对我来说,这对最终用户来说似乎是很多额外的工作,因为每个作业类都将创建用于执行特定作业,并且可以有 100 个作业类。

如果我的假设是错误的,请纠正我。

原文由 Umesh Awasthi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 427
2 个回答

我有类似的需求,我想确保创建的任何实现特定接口的类始终是真正可序列化的。我创建了一个 JavaClassFinder,它遍历类路径中的所有目录,并找到可分配给我关心的接口的所有类。这是一个代码片段:

 public <T> List<Class<? extends T>> findAllMatchingTypes(Class<T> toFind) {
    foundClasses = new ArrayList<Class<?>>();
    List<Class<? extends T>> returnedClasses = new ArrayList<Class<? extends T>>();
    this.toFind = toFind;
    walkClassPath();
    for (Class<?> clazz : foundClasses) {
        returnedClasses.add((Class<? extends T>) clazz);
    }
    return returnedClasses;
}

如果有帮助,我很乐意与您分享代码。唯一的缺点是这只会处理 .class 文件——我没有添加解压 .jars 并从那里读取类文件的功能。 (但添加它不会是一个巨大的项目。)

更新: 我检查了上面的源代码,发现它依赖于我们标准实用程序库中的许多帮助程序类。为了方便起见,我压缩了所有需要的代码,您可以从 JavaClassFinder.zip 下载这些代码。这将直接在 Eclipse 中设置,您可以获取所需代码的任何部分。

您会在项目中找到一个名为 JavaClassFinderTest.java 的 JUnit3 测试,它向您展示了 JavaClassFinder 类的特性和用法。运行 Junit 测试所需的唯一外部依赖项是 Junit。

此实用程序的基本用法:

     JavaClassFinder classFinder = new JavaClassFinder();
    List<Class<? extends MyTagInterface>> classes = classFinder.findAllMatchingTypes(MyTagInterface.class);

这将为您提供一个列表,其中包含类路径中可从“MyTagInterface.class”(例如)分配的任何类。希望这可以帮助。

原文由 Sam Goldberg 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以 在这里 找到答案。

我可以建议使用 org.reflections

你可以在这里看看

Reflections reflections = new Reflections("com.mycompany");
Set<Class<? extends MyInterface>> classes = reflections.getSubTypesOf(MyInterface.class);

原文由 Alex Stybaev 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题