Java中检查实体中是否包含某个字段,如果包含,则获取某个字段得值

1、代码

/**
     * 检查实体中是否包含某个字段
     * @param obj
     * @param fieldName
     * @return
     */
    public static boolean hasFieldInEntityOrInnerClass(Object obj, String fieldName) {
        Class<?> clazz = obj.getClass();
        return hasFieldInClass(clazz, fieldName);
    }

    private static boolean hasFieldInClass(Class<?> clazz, String fieldName) {
        // Check if the current class contains the field.
        for (Field field : clazz.getDeclaredFields()) {
            if (field.getName().equals(fieldName)) {
                return true;
            }
        }

        // Check inner classes recursively.
        Class<?>[] innerClasses = clazz.getDeclaredClasses();
        for (Class<?> innerClass : innerClasses) {
            if (hasFieldInClass(innerClass, fieldName)) {
                return true;
            }
        }

        // Check superclass recursively.
        if (clazz.getSuperclass() != null) {
            return hasFieldInClass(clazz.getSuperclass(), fieldName);
        }

        return false;
    }


    /**
     * 从实体或其内部类中获取指定字段的值。
     *
     * @param obj 实体对象。
     * @param fieldName 字段名。
     * @return 字段的值,如果字段不存在则返回null。
     * @throws IllegalAccessException 如果无法访问字段。
     */
    public static Object getFieldValueInEntityOrInnerClass(Object obj, String fieldName) throws IllegalAccessException {
        Class<?> clazz = obj.getClass();
        return getFieldValueInClass(clazz, obj, fieldName);
    }

    private static Object getFieldValueInClass(Class<?> clazz, Object obj, String fieldName) throws IllegalAccessException {
        // 检查当前类是否包含目标字段
        for (Field field : clazz.getDeclaredFields()) {
            if (field.getName().equals(fieldName)) {
                field.setAccessible(true);
                return field.get(obj);
            }
            // 如果字段值是内部类实例,递归调用
            if (field.getType().isMemberClass() && field.getType().getDeclaredFields().length > 0) {
                field.setAccessible(true);
                Object fieldValue = field.get(obj);
                if (fieldValue != null) {
                    return getFieldValueInClass(field.getType(), fieldValue, fieldName);
                }
            }
        }

        // 检查内部类
        Class<?>[] innerClasses = clazz.getDeclaredClasses();
        for (Class<?> innerClass : innerClasses) {
            if (obj instanceof Collection) {
                for (Object element : (Collection<?>) obj) {
                    if (innerClass.isInstance(element)) {
                        return getFieldValueInClass(innerClass, element, fieldName);
                    }
                }
            } else if (innerClass.isInstance(obj)) {
                return getFieldValueInClass(innerClass, obj, fieldName);
            }
        }

        // 检查超类
        if (clazz.getSuperclass() != null) {
            return getFieldValueInClass(clazz.getSuperclass(), obj, fieldName);
        }

        return null;
    }

2、调用

public <T> InputMsgReq buildInputMsgReq(T req, Class<T> reqClazz, String traNum) throws IOException,JeecgBootException {
        // 在这里调用 hasFieldInEntityOrInnerClass 方法检查 psn_no 字段,并保存返回结果
        boolean hasPsnNo = hasFieldInEntityOrInnerClass(req, "psn_no");
        // 使用返回的结果
        if (hasPsnNo) {
                Object psnNoValue = getFieldValueInEntityOrInnerClass(req, "psn_no");
                // 可以处理你得业务
        } else {
            
        }
        return inputMsgReq;
    }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值