从类中获取带注释的变量

时间:2012-12-27 10:18:30

标签: java reflection

这个问题是我之前发现的问题的后续问题 java: get all variable names in a class

我想要的是从类中获取变量,但不是全部获取变量,我只想要具有注释@isSearchable的变量。

基本上我有两个问题:

  • 如何创建注释?

  • 如何仅通过此注释过滤我的字段?

还有一件事,如果它是我经常使用的东西是可取的(我猜测反射应该很慢)。

谢谢

4 个答案:

答案 0 :(得分:3)

/** Annotation declaration */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface isSearchable{
    //...   
}

@isSearchable
public String anyField = "any value";
检查如下:

//use MyClass.class.getDeclaredFields() if you want the fields only for this class.
//.getFields() returns the fields for all the class hierarchy
for(Field field : MyClass.class.getFields()){
    isSearchable s = field.getAnnotation(isSearchable.class);
    if (s != null) {
        //field has the annotation isSearchable
    } else {
        //field has not the annotation
    }
}

答案 1 :(得分:2)

  

如何仅通过此注释过滤我的字段?

您可以通过这个简单的代码段获取

Field field = ... //obtain field object
Annotation[] annotations = field.getDeclaredAnnotations();

for(Annotation annotation : annotations){
    if(annotation instanceof IsSearchable){
        MyAnnotation myAnnotation = (MyAnnotation) annotation;
        System.out.println("name: " + myAnnotation.name());
        System.out.println("value: " + myAnnotation.value());
    }
}

在上面的代码段中,您基本上只过滤了IsSearchable个注释。

关于one more thing查询

是的,反思会很慢,如所讨论here,如果可以避免,会建议你避免。

答案 2 :(得分:2)

这是一个例子

class Test {
    @IsSearchable
    String str1;
    String str2;

    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @interface IsSearchable {
    }

    public static void main(String[] args) throws Exception {
        for (Field f : Test.class.getDeclaredFields()) {
            if (f.getAnnotation(IsSearchable.class) != null) {
                System.out.println(f);
            }
        }
    }
}

打印

java.lang.String Test.str1

答案 3 :(得分:1)

Field.getDeclaredAnnotations()为您提供每个字段的注释。

要回答你的补充问题,我通常希望反思很慢。话虽如此,我可能不会担心优化,直到这成为你的问题。

提示:确保您正在查看up-to-date Javadoc。谷歌倾向于给我Java 1.4 Javadocs,并且在Java 5之前就没有注释。