【问题标题】:Annotation Processor, Getting Modifiers of Method Parameters注释处理器,获取方法参数的修饰符
【发布时间】:2017-06-21 09:29:28
【问题描述】:

我目前在一个项目中使用 Java 的自定义注释。我想强制使用我的注释的用户,如果他用@Foo 注释了方法,他必须在方法参数列表中至少声明一个final boolean b。所以它应该看起来像这样:

@Foo
public void foo(final boolean b) { }

@Foo
public void bar() { } // This should result in an error

使用我的注释处理器,我可以检索变量的类型但不能检索最终修饰符。如果我想检索一组修饰符,如下面的代码所示,尽管参数上存在最终修饰符,但该组始终为空。

for (VariableElement parameter : method.getParameters()) {
    Set<Modifier> modifiers = parameter.getModifiers(); // This set is always empty
}

任何想法,为什么会这样?

【问题讨论】:

  • 如果您查看反编译的类,您会看到编译器从所有最终参数中删除了 final 关键字。这是合理的,因为final 仅在编译时才有意义。
  • 感谢@AndrewTobilko 的快速回复。我现在可以看到问题了。所以你说用我的方法我将无法实现这个?我需要以某种方式强制用户将此方法参数设为final,这样他就无法在方法主体内重新分配变量值。

标签: java annotations annotation-processing


【解决方案1】:

不幸的是,javax.lang.model 类似乎没有忠实地表示参数的 final 修饰符(即,根据源文件)。 documentation of the javax.lang.model.element package 说(我的粗体字):

在注释处理的上下文中使用时,必须返回被表示元素的准确模型。由于这是一种语言模型,源代码提供了所讨论结构的基准(参考)表示,而不是像类文件这样的可执行输出中的表示。 可执行输出可以作为创建建模元素的基础。但是,将源代码转换为可执行输出的过程可能不允许恢复源代码表示的某些方面。 例如,无法从类文件中恢复具有源保留的注释,并且类文件可能无法提供源代码位置信息。参数名称可能无法从类文件中恢复。在某些情况下,元素上的修饰符可能会有所不同,包括:

  • strictfp 在类或接口上
  • final 在参数上
  • protectedprivatestatic 在类和接口上

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多