java - 库类中的枚举占位符

标签 java enums annotations

我正在创建一个非常通用的注释处理器(例如 xjc),它扫描我的源代码并基于它生成额外的类。理想情况下,特定于领域的库应该依赖于注释处理器库(它不了解该领域)。

我放置在注释处理器中的两个字段是 minVersion 和 maxVersion。代码看起来像这样:

@ProcessMe(minVersion=Version.1_3_5, maxVersion=Version.1_5)
private Foo fieldFoo;

注释处理器的目标是创建一个对象,该对象仅在请求版本介于 1.3.5 和 1.5 之间时才进行特殊处理。

不幸的是,要实现这一点,注释处理器需要了解@ProcessMe,并且@ProcessMe需要了解VersionVersion 是特定于域的。

我最初的想法是我会有一个 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/

相关文章:

java - 删除 XML 组件而不是隐藏?

java - m2e如何判断项目是否具有java性质?

c# - 在 C# 中使用枚举进行数学运算(例如 DayOfWeek)

c++ - 以某种方式将 If/Else 转换为开关

Java - 将带有注释的类传递给泛型方法

java - 是否有类似库的 Commons AnnotationUtils? ( java )

java - 是否可以使用注释实现方法级访问检查?

java - 从按钮过渡到 EditText

java - JPQL 查询转换为 SQL 查询

java - 在 cassandra 主数据库中包含枚举列是否会影响 cassandra 负载平衡?