我正在创建一个非常通用的注释处理器(例如 xjc),它扫描我的源代码并基于它生成额外的类。理想情况下,特定于领域的库应该依赖于注释处理器库(它不了解该领域)。
我放置在注释处理器中的两个字段是 minVersion 和 maxVersion。代码看起来像这样:
@ProcessMe(minVersion=Version.1_3_5, maxVersion=Version.1_5)
private Foo fieldFoo;
注释处理器的目标是创建一个对象,该对象仅在请求版本介于 1.3.5 和 1.5 之间时才进行特殊处理。
不幸的是,要实现这一点,注释处理器需要了解@ProcessMe
,并且@ProcessMe
需要了解Version
和Version
是特定于域的。
我最初的想法是我会有一个 Version 实现的 VersionInfo 接口(interface)(我所需要的只是能够枚举可能的值并比较它们)。不幸的是,即使 VersionInfo 扩展了 Enum,我也无法在注释中指定它,因为注释只能包括原语、字符串、类、注释、枚举和上述的一维数组。
那么,任何人都可以想出一种方法来完成这项工作,而不需要注释处理器具有特定于领域的知识(版本是特定于领域的,因为一个产品可能使用与另一个产品完全不同的版本控制方案)。
最佳答案
我建议如下。
将接口(interface)ProcessorFilter
定义到您的通用库中。这个界面应该看起来像
interface ProcessorFilter {
boolean shouldProcess(Element element);
}
该处理器的所有实现都是在特定领域的库中完成的。
就您而言:
class DomainProcessorFilter {
public boolean shouldProcess(Element element) {
//returns true if element is annotated with ProcessMe and version is OK
}
}
您的通用库应该在类路径中发现ProcessorFilter
的所有实现并运行它们。您可以使用Reflections为了这。
关于java - 库类中的枚举占位符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24125540/