我目前正处于使用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
}
任何想法,为什么会这样?我错过了什么吗?
答案 0 :(得分:4)
不幸的是,似乎参数的final
修饰符没有被javax.lang.model
类忠实地表示(即,根据源文件)。 documentation of the javax.lang.model.element
package说(加粗我的):
在注释处理的上下文中使用时,必须返回所表示元素的准确模型。由于这是一种语言模型,源代码提供了所讨论的构造的基准(参考)表示,而不是类似于类文件的可执行输出中的表示。 可执行输出可以作为创建建模元素的基础。但是,将源代码转换为可执行输出的过程可能不允许恢复源代码表示的某些方面。例如,无法从类文件中恢复具有源保留的注释,并且类文件可能无法提供源代码位置信息。参数名称可能无法从类文件中恢复。元素上的修饰符可能在某些情况下有所不同,包括:
strictfp
在类或接口上- 关于类和接口的
final
参数protected
,private
和static