我有一个Person bean,需要ssn和gender作为必填字段
@Entity
public class Person {
@Id
private Long id;
@NotNull
private String ssn;//This is mandatory
@NotNull
private Gender gender;//This is mandatory
private String firstname;
private Date dateOfBirth;
...
}
我在一个类MandatoryFieldsFinder,没有访问person对象,有没有办法找出这些强制字段在运行时在hibernate或使用反射?我是一个完全的反射新手,不想使用它。
public class MandatoryFieldsFinder{
public list getAllMandatoryFieldsFromPerson(){
....
//I need to find the mandatory fields in Person class here
...
}
}
如果您想在运行时这样做,唯一的方法是使用反射(当您掌握它的窍门时,它实际上非常有趣!)。像下面这样一个简单的实用方法就可以做到:
/**
* Gets a List of fields from the class that have the supplied annotation.
*
* @param clazz
* the class to inspect
* @param annotation
* the annotation to look for
* @return the List of fields with the annotation
*/
public static List<Field> getAnnotatedFields(Class<?> clazz,
Class<? extends Annotation> annotation) {
List<Field> annotatedFields = new ArrayList<Field>();
for (Field field : clazz.getDeclaredFields()) {
if (field.isAnnotationPresent(annotation)) {
annotatedFields.add(field);
}
}
return annotatedFields;
}
你可以使用以下命令实现你的getAllMandatoryFieldsFromPerson()
方法:
getAnnotatedFields(MyClass.class, NotNull.class)
请注意,并不是所有的注释都在运行时可用——这取决于它们的保留策略。如果@NotNull
有RUNTIME
的保留策略,那么没问题,否则你必须在编译时做一些事情。
我很感兴趣,为什么您首先需要这些信息—这通常是JSR303 bean验证将为您处理的事情。
您可以查询字段上的注释是否存在:
// walk through fields
for (Field field : extractFields(target)) {
final InjectView annotation = field.getAnnotation(InjectView.class);
if (annotation != null) {
…做任何必要的事}}
https://github.com/ko5tik/andject/blob/master/src/main/java/de/pribluda/android/andject/ViewInjector.java