这个问题是我之前发现的问题的后续问题 java: get all variable names in a class
我想要的是从类中获取变量,但不是全部获取变量,我只想要具有注释@isSearchable
的变量。
基本上我有两个问题:
如何创建注释?
如何仅通过此注释过滤我的字段?
还有一件事,如果它是我经常使用的东西是可取的(我猜测反射应该很慢)。
谢谢
答案 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之前就没有注释。