无法获取方法的参数注释,下面是一个易于测试的演示,欢迎任何指向错误的方向:
// Annotation
public @interface At {}
// Class
public class AnnoTest {
public void myTest(@At String myVar1, String myVar2){}
}
// Test
public class App {
public static void main(String[] args) {
Class myClass = AnnoTest.class;
Method method = myClass.getMethods()[0];
Annotation[][] parameterAnnotations = method.getParameterAnnotations();
// Should output 1 instead of 0
System.out.println(parameterAnnotations[0].length);
}
}
答案 0 :(得分:3)
您没有隐式设置Retention
到运行时,这样它默认为@Retention (RetentionPolicy.CLASS)
这表示它在类文件中表示但在VM中不存在。为了使其工作,将其添加到您的界面:@Retention (RetentionPolicy.RUNTIME)
作为类注释,然后它再次工作! :d
当您使用它时,您可能希望将特定@Target
设置为仅参数而不是方法/字段/类等。
答案 1 :(得分:1)
默认情况下,编译器会在类文件中记录注释,但运行时不需要保留注释(正在应用RetentionPolicy.CLASS保留策略)。
要更改注释的保留时间,您可以使用保留元注释。
在您的情况下,您希望使其可用于阅读反射,因此您需要它必须使用RetentionPolicy.RUNTIME在类文件中记录注释,但在运行时由VM保留。
@Retention(RetentionPolicy.RUNTIME)
public @interface At {}
我还建议您指明注释类型 At 适用的程序元素。
在您的情况下,参数注释应为
@Target(ElementType.PARAMETER)
这样编译器将强制执行指定的使用限制。
默认情况下,声明的类型可用于任何程序元素:
- ANNOTATION_TYPE - 注释类型声明
- CONSTRUCTOR - 构造函数声明
- FIELD - 字段声明(包括枚举常量)
- LOCAL_VARIABLE - 本地变量声明
- 方法 - 方法声明
- 包裹 - 包裹声明
- PARAMETER - 参数声明
- TYPE - 类,接口(包括注释类型)或枚举声明