我正在创建一个非常通用的注释处理器(例如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接口(我需要的只是能够枚举可能的值并进行比较)。不幸的是,即使VersionInfo扩展了Enum,我也无法在注释中指定它,因为注释只能包含上述的原始,字符串,类,注释,枚举和1-D数组。
因此,任何人都可以想到一种方法来使这项工作不要求注释处理器具有域特定知识(该版本是特定于域的,因为一种产品可能使用与另一种产品完全不同的版本控制方案)
答案 0 :(得分:1)
我建议如下。
将接口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。