【问题标题】:Enum placeholder in library class库类中的枚举占位符
【发布时间】:2014-06-09 17:27:25
【问题描述】:

我正在创建一个非常通用的注释处理器(例如 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 接口(我所需要的只是能够枚举可能的值并比较它们)。不幸的是,即使 VersionInfo 扩展了 Enum,我也无法在注解中指定它,因为注解只能包含上述的基元、字符串、类、注解、枚举和一维数组。

那么,任何人都可以想出一种方法来使这项工作不需要注释处理器具有特定领域的知识(版本是特定于领域的,因为一个产品可能使用与另一个产品完全不同的版本控制方案)。

【问题讨论】:

    标签: java enums annotations


    【解决方案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

    【讨论】:

    • 嗯...问题是注释处理器在编译之前看到了代码,所以即使我找到了 ProcessorFilter 的实例,我也无法实例化它。我想我可以重写整个 apt 过程以使用 Reflections 并在开始时加载它。此外,我可以有 3 个库,通用处理器库、特定领域库和特定领域处理器插件。这让我想到了一些事情。
    • @Pace,祝你好运。注释处理的实现非常辛苦。
    猜你喜欢
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多