我正在开发一个应用程序(Quartz 调度程序),我们有一个作业类负责实际执行工作,我们需要在 Quartz 调度程序中创建触发器时告知/传递作业类的名称。
我想为所有想要使用 API 的人提供一个扩展点(除了一些我将作为 API 的一部分提供的通用作业)。这个想法是创建一个(标记)接口,如果有人想将他们的类声明为调度程序作业类,他们所要做的就是(声明)实现该接口。
我不确定如何找到哪些类遵循合同(通过实现接口),以便我可以将它们显示给想要在调度程序中安排触发器的用户。
我的要求不是在运行时加载类,而是向用户显示实现所需接口的类列表,以便用户可以选择类并将类名传递给调度程序。它是 Quartz 调度器,它最终将负责创建一个类的实例。
任何人都可以建议我如何实现上述目标,或者有没有其他更好的方法来实现我想要做的事情?
编辑
我浏览了 ServiceLoader 的文档,似乎要实现一项服务,必须在 META-INF 文件夹中创建一个文件,其中包含实现类的名称,这让我想到,如果我的 API 的用户想要 20 个不同的实施时,他必须在文件中放入 20 个条目,对我来说,这对最终用户来说似乎是很多额外的工作,因为每个作业类都将创建用于执行特定作业,并且可以有 100 个作业类。
如果我的假设是错误的,请纠正我。
原文由 Umesh Awasthi 发布,翻译遵循 CC BY-SA 4.0 许可协议
我有类似的需求,我想确保创建的任何实现特定接口的类始终是真正可序列化的。我创建了一个 JavaClassFinder,它遍历类路径中的所有目录,并找到可分配给我关心的接口的所有类。这是一个代码片段:
如果有帮助,我很乐意与您分享代码。唯一的缺点是这只会处理 .class 文件——我没有添加解压 .jars 并从那里读取类文件的功能。 (但添加它不会是一个巨大的项目。)
更新: 我检查了上面的源代码,发现它依赖于我们标准实用程序库中的许多帮助程序类。为了方便起见,我压缩了所有需要的代码,您可以从 JavaClassFinder.zip 下载这些代码。这将直接在 Eclipse 中设置,您可以获取所需代码的任何部分。
您会在项目中找到一个名为 JavaClassFinderTest.java 的 JUnit3 测试,它向您展示了 JavaClassFinder 类的特性和用法。运行 Junit 测试所需的唯一外部依赖项是 Junit。
此实用程序的基本用法:
这将为您提供一个列表,其中包含类路径中可从“MyTagInterface.class”(例如)分配的任何类。希望这可以帮助。