Java使用反射通过属性值反向获取字段名称

先贴代码,方法使用注释已经写得很清楚了

    /**
     * 获取指定对象中指定属性名的值
     *
     * @param obj          对象
     * @param propertyName 字段名
     * @return 属性值
     * @throws IllegalAccessException 非法访问异常
     */
    public static Object getPropertyValue(Object obj, String propertyName) throws IllegalAccessException {
        Class<?> aClazz = obj.getClass();
        Field field;
        if ((field = getField(aClazz, propertyName)) == null) {
            return null;
        }
        field.setAccessible(true);
        return field.get(obj);
    }

    /**
     * 获取class中指定字段名的字段对象,找不到往父类中找
     *
     * @param clazz        class
     * @param propertyName 字段名
     * @return 字段对象
     */
    public static Field getField(Class<?> clazz, String propertyName) {
        if (clazz == null) {
            return null;
        }
        try {
            return clazz.getDeclaredField(propertyName);
        } catch (NoSuchFieldException e) {
            return getField(clazz.getSuperclass(), propertyName);
        }
    }

    /**
     * 根据指定值获取指定对象中的字段名
     *
     * @param obj   对象
     * @param value 字段对应的值
     * @return 字段名
     * @throws IllegalAccessException 非法访问异常
     */
    public static String getFieldNameByValue(Object obj, String value) throws IllegalAccessException {
        Class<?> aClass = obj.getClass();
        Field[] declaredFields = getDeclaredFields(aClass);
        if (declaredFields != null) {
            for (Field declaredField : declaredFields) {
                String name = declaredField.getName();
                Object propertyValue = getPropertyValue(obj, name);
                if (propertyValue instanceof String && propertyValue.toString().equals(value)) {
                    return name;
                }
            }
        }
        return null;
    }

    /**
     * 获取此class中的所有字段,找不到往父类找,注意有可能发生堆栈溢出错误{@link StackOverflowError}
     *
     * @param aClass class
     * @return 字段数组
     */
    public static Field[] getDeclaredFields(Class<?> aClass) {
        if (aClass == null) {
            return null;
        }
        Field[] declaredFields = aClass.getDeclaredFields();
        return declaredFields.length == 0 ? getDeclaredFields(aClass.getSuperclass()) : declaredFields;
    }

PS:由于实际业务问题目前只支持String类型的获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值