我正在开发一个应用程序(Quartz调度程序),其中有一个作业类负责实际执行工作,我们需要在Quartz调度程序中创建触发器时告知/传递作业类的名称。
我想为所有想使用该API的人提供一个扩展点(除了我将作为API的一部分提供的一些通用作业之外)。这个想法是创建一个(标记)接口,如果有人想将其类声明为调度程序作业类,那么他们要做的就是(声明)实现该接口。
我不确定如何找到合约之后的类(通过实现接口),以便将其显示给想要在计划程序中计划触发器的用户。
我的要求不是在运行时加载类,而是向用户显示实现所需接口的类列表,以便用户可以选择类,并且可以将类名传递给调度程序。
最后是Quartz调度程序,它将负责创建类的实例。
有人可以建议我如何实现上述目标,还是有其他更好的方法来实现我正在尝试的目标?
编辑
我仔细阅读了ServiceLoader的文档,看来要实现服务,必须在META-
INF文件夹中创建一个文件,并带有实现类的名称,这使我认为,如果我的API用户想要20种不同的文件,实施中,他必须在文件中放入20个条目,对我来说,这对于最终用户而言似乎是很多额外的工作,因为将为执行特定的作业而创建每个作业类,并且可能有100个作业类。
如果我的假设是错误的,请纠正我。
我有一个类似的需求,我想确保所创建的实现某个接口的所有类始终可真正序列化。我创建了一个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”分配的类路径中的所有类(例如)。希望这可以帮助。
问题内容: 我尝试使用Java ServiceLoader查找实现特定接口的所有类,如下所示: 不幸的是,当我在调试模式下运行Eclipse时,ServiceLoader找不到任何类。我觉得我错过了一个琐碎的事情… 问题答案: 无法做到。 为了将类公开为可以被发现的服务,您需要将其名称放入提供程序配置文件中,如使用Java平台创建可扩展应用程序中所述 。 没有内置的方法可以找到实现特定接口的所有类
问题内容: 前一段时间,我遇到了一段代码,该代码使用了一些标准Java功能来定位实现给定接口的类。我知道这些函数隐藏在某些非逻辑的位置,但是由于包名称暗含,它们可以用于其他类。那时我不需要它,所以我忘记了它,但是现在我需要了,而且似乎无法再次找到这些函数。在哪里可以找到这些功能? 编辑:我不是在寻找任何IDE函数或任何东西,而是可以在Java应用程序中执行的东西。 问题答案: 不久前,我整理了一个
这是我的OWL文件的一部分: 如何仅从属性中获取
我需要在我的Spring引导应用程序中找到只实现一个特定接口的类。我面临的问题是,ClassPathBean定义扫描仪正在返回实现“扩展”子接口的类。 示例: 以下是我目前使用的代码: 现在的结果是数组字符串“beans”包含所有其他类,如F、G、H、I、J等。 如何以只返回只实现指定接口的选定类的方式构造我的TypeFitler,即过滤掉应用扩展接口的所有实现。例如B类,但E类除外。 以下是将C
问题内容: 我正在实现一个接口,现在我想在classpath中获得该接口的所有实现。这可能还是我应该做些其他的事情? 问题答案: 充其量,这将是昂贵的。在最坏的情况下(取决于类加载器),这可能是不可能的。 我强烈建议您寻找一种替代方法来解决您要解决的基本问题。
下面是适当的方法签名的样子: (问题领域是扑克;列举奥马哈扑克牌中所有可能的板卡组合。是的,还有其他方法可以解决这个问题,但我正在测试这个方法,因为处理比特比大多数其他选择要快得多。)