2015-05-14 130 views
3

有麻烦的方法的参数标注,下面是一个简单的测试演示,对错误的指示将受到欢迎:爪哇 - 参数标注

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

你面对什么样的错误? – Vihar

回答

3

您没有设置隐含设置Retention到运行时,这种方式默认为@Retention (RetentionPolicy.CLASS),这表示它在类文件中表示,但在虚拟机中不存在。为了使它工作,添加到您的界面:@Retention (RetentionPolicy.RUNTIME)作为类annotatio,然后它再次工作! :d

当你在这,你可能需要设置一个特定的@Target只参数,而不是方法/场/班等

1

默认情况下,注释是由编译器记录在类文件,但不需要在运行时由VM保留(正在应用RetentionPolicy.CLASS保留策略)。

要更改注释的保留时间,您可以使用保留元注释。

在你的情况,你想使它可用于读取反思所以你需要它必须使用RetentionPolicy.RUNTIME记录注释中的类文件,但还是老样子可以通过虚拟机在运行时保留。

@Retention(RetentionPolicy.RUNTIME) 
public @interface At {} 

我也建议你指明程序元件,其注释类型是适用的。

在你的情况,参数annotion应该

@Target(ElementType.PARAMETER) 

这样编译器会执行指定的使用限制。

默认情况下,声明的类型可以由任何程序元件上使用:

  • ANNOTATION_TYPE - 译注类型声明
  • CONSTRUCTOR - 构造函数声明
  • 领域 - 字段声明(包括枚举常数)
  • LOCAL_VARIABLE - 局部变量声明
  • 方法 - 方法声明
  • 包装 - 包装声明
  • 参数 - 参数声明
  • TYPE - 类,接口(包括注释类型)或枚举声明