5

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

我想要的是从一个类中获取变量,而不是全部获取它们,我只想要具有 annotation 的变量@isSearchable

所以基本上我有两个问题:

  • 如何创建注释?

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

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

谢谢

4

4 回答 4

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
    }
}
于 2012-12-27T10:29:20.877 回答
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查询

是的,正如这里所讨论的,反射会很慢,如果可以避免,建议您避免。

于 2012-12-27T10:26:37.337 回答
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
于 2012-12-27T10:27:25.403 回答
1

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

为了回答您的补充问题,我通常希望反思会很慢。话虽如此,在这成为您的问题之前,我可能不会担心优化。

提示:确保您检查的是最新的 Javadoc。Google 倾向于给我 Java 1.4 Javadocs,而注解在 Java 5 之前并不存在。

于 2012-12-27T10:21:41.300 回答