Pregunta Obtener el valor de un campo, dada la ruta jerárquica


Tengo un objeto que contiene propiedades secundarias, que también tienen propiedades secundarias y así sucesivamente.

Básicamente, necesito encontrar la mejor manera de recuperar el valor de un campo particular en el objeto, dado que es una ruta jerárquica completa como una cadena.

Por ejemplo, si el objeto tiene la compañía de campo (Objeto) que tiene el cliente de campo (Objeto) que tiene el ID de campo (Cadena), esta ruta se representará como company.client.id. Por lo tanto, dado un camino al campo en el que estoy tratando de obtener el valor de un objeto, ¿cómo voy a hacer esto?

Aclamaciones.


5
2017-10-21 15:27


origen


Respuestas:


Por favor encuentre abajo Fieldhelper clase con getFieldValue método. Debería permitirte resolver tu problema rápidamente dividiendo su cadena y luego aplicando el getFieldValue recursivamente, tomando el objeto resultante como entrada para el siguiente paso.

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;
    }

}

2
2017-10-21 15:38



Puedes usar Apache Commons BeanUtils  PropertyUtilsBean.

Ejemplo de uso:

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

5
2018-02-03 07:30



Necesitas primero dividir tu cadena para obtener individual fieldNames. Luego, para cada nombre de campo, obtenga la información requerida. Tendrías que iterar sobre tu matriz de fieldNames.

Puedes probar el siguiente código. No he usado Recursion sin embargo, pero funcionaría:

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);
}

1
2017-10-21 15:57



Preguntas populares