我有一个人 bean,需要 ssn ,性别作为必填字段
@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
...
}
}
答案 0 :(得分:1)
如果你想在运行时这样做,唯一的方法是使用反射(当你掌握它时,它实际上非常有趣!)。像下面这样的简单实用方法应该这样做:
/**
* 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)
但请注意,并非所有注释都在运行时可用 - 这取决于他们的retention policy。如果@NotNull
的保留政策为RUNTIME
,那就没关系,否则您必须在编译时执行某些操作。
我很感兴趣为什么你首先需要这些信息 - 这通常是JSR303 bean验证会为你处理的事情。
答案 1 :(得分:0)
您可以在字段上查询注释的存在:
// walk through fields
for (Field field : extractFields(target)) {
final InjectView annotation = field.getAnnotation(InjectView.class);
if (annotation != null) {
......做任何必要的事 } }