这个问题是我在java之前发现的一个问题的后续
:get all variable names in a class
我想要的是从一个类中获取变量,而不是全部获取它们,我只想要具有 annotation 的变量@isSearchable
。
所以基本上我有两个问题:
如何创建注释?
如何仅通过此注释过滤我的字段?
还有一件事,如果它是我经常使用的东西,它是可取的(我猜反射应该很慢)。
谢谢
这个问题是我在java之前发现的一个问题的后续
:get all variable names in a class
我想要的是从一个类中获取变量,而不是全部获取它们,我只想要具有 annotation 的变量@isSearchable
。
所以基本上我有两个问题:
如何创建注释?
如何仅通过此注释过滤我的字段?
还有一件事,如果它是我经常使用的东西,它是可取的(我猜反射应该很慢)。
谢谢
/** 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
}
}
如何仅通过此注释过滤我的字段?
你可以通过这个简单的片段
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
查询
是的,正如这里所讨论的,反射会很慢,如果可以避免,建议您避免。
这是一个例子
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
Field.getDeclaredAnnotations()为您提供每个字段的注释。
为了回答您的补充问题,我通常希望反思会很慢。话虽如此,在这成为您的问题之前,我可能不会担心优化。
提示:确保您检查的是最新的 Javadoc。Google 倾向于给我 Java 1.4 Javadocs,而注解在 Java 5 之前并不存在。