Java - 参数注释

时间:2015-05-14 12:21:07

标签: java annotations

无法获取方法的参数注释,下面是一个易于测试的演示,欢迎任何指向错误的方向:

// 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);
    }
}

2 个答案:

答案 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 - 类,接口(包括注释类型)或枚举声明
  •