给定分层路径,获取字段的值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给定分层路径,获取字段的值相关的知识,希望对你有一定的参考价值。

我有一个包含子属性的对象,它也有子属性等等。

我基本上需要找到检索对象上特定字段值的最佳方法,因为它是一个完整的分层路径作为字符串。

例如,如果对象具有字段company(Object),其字段client(Object)具有字段id(String),则此路径将表示为company.client.id。因此,给定一个通向该字段的路径,我试图获取对象的值,我将如何进行此操作?

干杯。

答案

请使用Fieldhelper方法找到下面的getFieldValue类。它应该允许您通过拆分字符串然后递归地应用getFieldValue来快速解决问题,将结果对象作为下一步的输入。

package com.bitplan.resthelper;
import java.lang.reflect.Field;

/**
 * Reflection help
 * @author wf
 *
 */
public class FieldHelper {

    /**
     * get a Field including superclasses
     * 
     * @param c
     * @param fieldName
     * @return
     */
    public Field getField(Class<?> c, String fieldName) {
        Field result = null;
        try {
            result = c.getDeclaredField(fieldName);
        } catch (NoSuchFieldException nsfe) {
            Class<?> sc = c.getSuperclass();
            result = getField(sc, fieldName);
        }
        return result;
    }

    /**
     * set a field Value by name
     * 
     * @param fieldName
     * @param Value
     * @throws Exception
     */
    public void setFieldValue(Object target,String fieldName, Object value) throws Exception {
        Class<? extends Object> c = target.getClass();
        Field field = getField(c, fieldName);
        field.setAccessible(true);
        // beware of ...
        // http://docs.oracle.com/javase/tutorial/reflect/member/fieldTrouble.html
        field.set(this, value);
    }

    /**
     * get a field Value by name
     * 
     * @param fieldName
     * @return
     * @throws Exception
     */
    public Object getFieldValue(Object target,String fieldName) throws Exception {
        Class<? extends Object> c = target.getClass();
        Field field = getField(c, fieldName);
        field.setAccessible(true);
        Object result = field.get(target);
        return result;
    }

}
另一答案

你可以使用Apache Commons BeanUtils PropertyUtilsBean

使用示例:

PropertyUtilsBean pub = new PropertyUtilsBean();
Object property = pub.getProperty(yourObject, "company.client.id");
另一答案

您需要首先拆分您的字符串以获得单独的fieldNames。然后,对于每个字段名称,获取所需信息。你必须迭代你的fieldNames数组。

您可以尝试以下代码。我没有使用Recursion,但它会工作: -

public static void main(String[] args) throws Exception {

    String str = "company.client.id";
    String[] fieldNames = str.split("\.");

    Field field;

    // Demo I have taken as first class that contains `company`
    Class<?> targetClass = Demo.class;  
    Object obj = new Demo();

    for (String fieldName: fieldNames) {

        field =  getFieldByName(targetClass, fieldName);    
        targetClass = field.getType();

        obj = getFieldValue(obj, field);            
        System.out.println(field + " : " + obj);

    }

}

public static Object getFieldValue(Object obj, Field field) throws Exception {
    field.setAccessible(true);
    return field.get(obj);
}

public static Field getFieldByName(Class<?> targetClass, String fieldName) 
                                                        throws Exception {
    return targetClass.getDeclaredField(fieldName);
}

以上是关于给定分层路径,获取字段的值的主要内容,如果未能解决你的问题,请参考以下文章

给定一个 ExpressionType.MemberAccess 类型,我如何获取字段值?

BigQuery - 在给定的时间点获取不同的值

如何从URL获取片段标识符(hash#之后的值)?

用于 WordPress 的 PHP 片段,用于获取所有产品子类别

Kotlin:获取点击项目列表视图的值(片段+适配器)

从 URL 获取片段(哈希“#”后的值)[关闭]