从类中获取带注释的变量

5
这个问题是之前我发现的一个问题的后续。
Java:获取类中所有变量名称

我想要做的是从一个类中获取变量,但是不是获取所有变量,我只需要具有注释@isSearchable 的变量。
所以基本上我有两个问题:
  • 如何创建注释?

  • 如何仅根据此注释过滤字段?

还有一件事,如果我经常使用它,是否建议使用它(我猜反射应该很慢)。
谢谢

@T.J.Crowder 我不熟悉注释或者这是否是它们的使用案例。谢谢大家的回答,这真的很有帮助。 - Dany Y
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
    }
}

还有一个问题,是否建议仅在需要节省编写代码的时间时使用它? - Dany Y
这取决于具体情况,通常我们应该避免使用反射,因为它会增加额外的开销,但如果在可维护性、可读性和可测试性方面有很大的收益,我认为我们可以使用它。如果需要优化,应该依靠分析工具来确定优化的领域。 - vishal_aim

2
如何仅通过此注释过滤我的字段?
您可以使用以下简单代码片段:
```python your_code_here ```
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注释。
关于您的“另外一件事”查询
是的,正如在这里讨论的那样,反射会很慢,如果可以避免,建议您避免使用。

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

1

Field.getDeclaredAnnotations() 可以为每个字段提供注释。

回答您的补充问题,我通常认为反射会比较慢。话虽如此,直到这成为您的问题之前,我可能不会担心优化。

提示:确保您正在检查最新的Javadoc。Google往往会给我Java 1.4 Javadocs,并且在Java 5之前不存在注释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接