【问题标题】:Java. How to get non-nullable fields by reflection?爪哇。如何通过反射获取不可为空的字段?
【发布时间】:2017-03-01 15:19:41
【问题描述】:

我尝试从类(休眠实体)中获取字段列表。像这样:

实体:

public class A {

    public static final Integer someValue = 1;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "a_id")
    private Integer id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "a_b_id", nullable = true)
    private List<B> b;

    @NotNull
    @Column(name = "a_c_id")
    private C c;

    .........................
}

获取非静态字段的方法:

public static List<Field> getNonStaticFields(Class clazz) {
    Field[] fields = clazz.getDeclaredFields();
    List<Field> fieldsList = new ArrayList<>();
    for (Field field : fields) {
        if (!Modifier.isStatic(field.getModifiers())) {
            fieldsList.add(field);
        }
    }

    return fieldsList;
}

但我只需要获取不可为空的非静态字段。这意味着我需要获取带有@NotNull 注释的字段和带有参数“nullable = false”的@JoinColumn 注释。

检查@NotNull 很简单:

field.isAnnotationPresent(NotNull.class)

但我不知道如何使用参数检查 @JoinColumn 的字段。 我该怎么做?有人可以帮帮我吗?

【问题讨论】:

    标签: java hibernate reflection annotations


    【解决方案1】:

    对于注解JoinColumn,你只需要先用getAnnotation(Class&lt;T&gt; annotationClass)得到它,然后检查nullable()的值。

    结果过滤器可能是:

    ...
    if (!Modifier.isStatic(field.getModifiers())) {
        // Add the field to the list only if it is annotated with NotNull
        // or annotated with JoinColumn and nullable is false
        JoinColumn jc;
        if (field.isAnnotationPresent(NotNull.class) || 
            ((jc = field.getAnnotation(JoinColumn.class)) != null && !jc.nullable())) {
            fieldsList.add(field);
        }
    }
    ..
    

    【讨论】:

    • 我会试试这个解决方案。感谢您的帮助!
    • 有没有办法访问这些字段的吸气剂?如果我执行 field.get(),它会抛出 java.lang.IllegalAccessException,因为该成员在实体中是私有的。有什么建议吗?
    • @infinite 如果是私人会员,您需要先使其可访问,看看docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/…
    猜你喜欢
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多