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

我目前正处于一个使用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 modifiers = parameter.getModifiers(); // This set is always empty } 

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

不幸的是,似乎参数的final修饰符没有被javax.lang.model类忠实地表示(即,根据源文件)。 javax.lang.model.element包的文档说(bolding mine):

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

  • 对类或接口的strictfp
  • 关于参数的final结果
  • 类和接口上的protectedprivatestatic