我想在我的类属性上添加注释,然后迭代我的所有属性,同时也可以查找注释。
例如,我有一个类:
public class User {
@Annotation1
private int id;
@Annotation2
private String name;
private int age;
// getters and setters
}
现在我希望能够遍历我的属性,并且能够知道属性上的注释(如果有的话)。
我想知道如何使用java进行此操作,但如果使用spring,guava或google guice会使这更容易(如果他们有任何助手可以更容易地做到这一点),那就好奇了。
答案 0 :(得分:2)
这是一个利用(几乎没有维护的)bean instrospection框架的例子。这是一个全Java解决方案,您可以扩展以满足您的需求。
public class BeanProcessor {
public static void main(String[] args) {
try {
final Class<?> beanClazz = BBean.class;
BeanInfo info = Introspector.getBeanInfo(beanClazz);
PropertyDescriptor[] propertyInfo = info.getPropertyDescriptors();
for (final PropertyDescriptor descriptor : propertyInfo) {
try {
final Field field = beanClazz.getDeclaredField(descriptor
.getName());
System.out.println(field);
for (final Annotation annotation : field
.getDeclaredAnnotations()) {
System.out.println("Annotation: " + annotation);
}
} catch (final NoSuchFieldException nsfe) {
// ignore these
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
答案 1 :(得分:2)
以下是创建自己的注释的方法
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Annotation1 {
public String name();
public String value();
}
定义注释后,使用问题中提到的注释,然后使用下面的反射方法获取带注释的类详细信息
Class aClass = User.class;
Annotation[] annotations = aClass.getAnnotations();
for(Annotation annotation : annotations){
if(annotation instanceof Annotation1){
Annotation1 myAnnotation = (Annotation1) annotation;
System.out.println("name: " + myAnnotation.name());
System.out.println("value: " + myAnnotation.value());
}
}
答案 2 :(得分:0)
你会使用反射来获取类的字段,然后在每个字段上调用类似getAnnotations()
的内容。
答案 3 :(得分:0)
我创建了下面的方法,该方法创建一个类中所有字段的流,并且它是具有特定批注的超类。 还有其他方法可以做到这一点。但是我认为此解决方案非常易于重用且实用,因为当您需要了解这些字段时,通常需要对每个字段进行操作。而Stream正是您要做的。
public static Stream<Field> getAnnotatedFieldStream(Class<?> theClass, Class<? extends Annotation> annotationType) {
Class<?> classOrSuperClass = theClass;
Stream<Field> stream = Stream.empty();
while(classOrSuperClass != Object.class) {
stream = Stream.concat(stream, Stream.of(classOrSuperClass.getDeclaredFields()));
classOrSuperClass = classOrSuperClass.getSuperclass();
}
return stream.filter(f -> f.isAnnotationPresent(annotationType));
}