我正在创建一个非常通用的注释处理器(例如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是特定于域的。
我最初的想法是,我将有一个VersionInfo接口来实现这个版本(我所需要的只是能够枚举可能的值并对它们进行比较)。不幸的是,即使VersionInfo扩展了Enum,我也无法在注释中指定它,因为注释只能包括上面的原语、字符串、类、注释、枚举和一维数组。
因此,谁能想到一种不需要注释处理器拥有特定领域知识的方法(版本是特定于领域的,因为一个产品可能使用与另一个产品完全不同的版本控制方案)。
发布于 2014-06-09 17:39:20
我建议如下。
将接口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的所有实现并运行它们。为此您可以使用反思。
https://stackoverflow.com/questions/24125540
复制相似问题