如何使用Java反映获得类级别的注释值?

时间:2017-10-10 08:17:17

标签: java class reflection annotations

我正在编写一个以Class实例作为参数的函数。我想获得在类上定义的特定注释的值。 分类:

@AllArgConstructor
@MyAnnotation(tableName = "MyTable")
public class MyClass {
    String field1;
}

想要检索注释值的函数。

public class AnnotationValueGetter{

    public String getTableName-1(Class reflectClass){
        if(reflectClass.getAnnotation(MyAnnotation.class)!=null){
            return reflectClass.getAnnotation(MyAnnotation.class).tableName();
//This does not work. I am not allowed to do .tableName(). Java compilation error


        }
    }

    public String getTableName-2{
         Class reflectClass = MyClass.class;
         return reflectClass.getAnnotation(MyAnnotation.class).tableName()
        //This works fine.`enter code here`
    }
}

MyAnnotation:

@DynamoDB
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
public @interface MyAnnotation {

    /**
     * The name of the table to use for this class.
     */
    String tableName();

}

函数getTableName-1显示编译错误,而getTableName-2工作得很好。我在这做错了什么?我想实现类似于getTableName-1的函数。

2 个答案:

答案 0 :(得分:0)

使用具有泛型类型参数的类:

 public String getTableName-1(Class<?> reflectClass){
       //Your code here.
}

还有一个建议, 最好使用reflectClass.isAnnotationPresent(MyAnnotation.class)代替reflectClass.getAnnotation(MyAnnotation.class)!=null作为if块中的条件。

答案 1 :(得分:0)

您可以通过这种方式访问​​这些值:

public class AnnotationValueGetter {

  public String getTableName1(Class reflectClass) {
    if (reflectClass.isAnnotationPresent(MyAnnotation.class)) {
     Annotation a = reflectClass.getAnnotation(MyAnnotation.class);
     MyAnnotation annotation = (MyAnnotation) a;
     return annotation.tableName();
    }
    return "not found";
  }
}