注释处理器,获取方法参数的修饰符

mic*_*ael 6 java annotations annotation-processing

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

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

@Foo
public void bar() { } // This should result in an error
Run Code Online (Sandbox Code Playgroud)

使用我的注释处理器,我可以检索变量的类型,但不能检索最终修饰符.如果我想要检索修改器集,如下面的代码所示,虽然最终修饰符出现在参数上,但该集将始终为空.

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

任何想法,为什么会这样?我错过了什么吗?

rol*_*lve 5

不幸的是,这些类似乎final没有忠实地表示参数的修饰符(即,根据源文件)javax.lang.model文档javax.lang.model.element说(加粗我的):

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

  • strictfp 在类或接口上
  • final 在参数上
  • protected, private, 和static类和接口