【问题标题】:The usage of Completion in java annotationjava注解中Completion的使用
【发布时间】:2020-09-21 13:48:24
【问题描述】:

关于 javax.annotation.processing 包中的 getCompletions 方法有很多混淆。这个方法返回的完成函数是什么?能否给我一个具体使用的例子。谢谢。

 Iterable<? extends Completion> getCompletions(Element element,
                                                  AnnotationMirror annotation,
                                                  ExecutableElement member,
                                                  String userText);

【问题讨论】:

    标签: java annotations completion


    【解决方案1】:

    关于 javax.annotation.processing 包中的 getCompletions 方法有很多混淆。

    由谁?

    这个方法返回的完成函数是什么?

    这是一个不错的可选功能。它的用途是专门帮助 IDE。

    当您使用javac 或其他命令行编译器编译代码时,根本不会调用此方法。它仅适用于 IDE。当你打开你的 eclipse 或 intellij 或诸如此类的东西时,输入 "Hello". 并等待 500 毫秒或点击 CTRL+SPACE 或 IDE 用于“自动完成”快捷方式的任何东西,你会得到一个显示所有各种方法的菜单字符串有。可能还有一些模板和其他功能; IDE 可以随意添加任何他们想要的东西,“IDE 中的自动完成器”没有实际的 Java 规范。

    不过,这就是这个方法的用途。

    具体来说,它是为了让 IDE 在您输入以下内容时帮助您:@YourAnn(someAnnotationParamName=...) - ... 部分中的任何位置,这就是与此功能相关的地方。

    下次如何自救

    文档很好……如果有的话。但在这种情况下,他们就在那里。无论您在哪里找到您的 javadoc(谷歌、您的 IDE 和许多其他地方)都可以找到有关此功能的文档:The javadoc of Processor.getCompletions 解释了一些东西,包括一个很好的示例。

    鉴于这个例子非常好,我不同意你关于“getCompletions 方法有很多混淆”的描述:)

    【讨论】:

    • 感谢您的回答。你对问题的理解是正确的。这个答案解决了我对 getCompletions 函数含义的困惑。但是我尝试在intelij中使用这个案例,但是IDE并没有给我一个完整的提示。也许我的配置不正确。能否提供一个文档,让我看到 IDE 提示完成注解值。
    • 您可能不得不查看一些 intellij 论坛 - 因为它是可选的,所以 intellij 可能不支持它。更一般地说,intellij 必须知道您的注释处理器,以便我可以调用完成方法。 intellij 将忽略您抛出的任何异常也是合理的 - 您可能想要添加(基于文件的)日志记录,检查您是否被调用。
    【解决方案2】:

    getCompletions 旨在供 IDE 使用。它可以帮助用户了解可以为注释提供哪些参数。

    Javadoc documentation 很好地描述了它。

    那里使用的例子是:假设有一个注释定义为

    @MersennePrime {
        int value(); // must be a prime of the form 2^n-1, e.g., 3, 7, 31, 127, 8191, ...
    }
    

    getComletions 的实现可以是

    return Arrays.asList(of("3"),
                          of("7"),
                          of("31"),
                          of("127"),
                          of("8191"),
                          of("131071"),
                          of("524287"),
                          of("2147483647"));
    

    如果用户编写了@MersennePrime,IDE 可以建议getCompletions 返回的参数。如果用户编写了@MersennePrime(1,则getCompletions 将作为userText 命令行参数传递“1”,并应返回一个仅包含127131071 的列表。

    【讨论】:

    • 感谢您的回答。这个回答解决了我对 getCompletions 目的的疑惑。
    猜你喜欢
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    相关资源
    最近更新 更多