11

サブ プロパティを含むオブジェクトがあり、サブ プロパティなどもあります。

基本的に、オブジェクトの特定のフィールドの値を取得するための最良の方法を見つける必要があります。これは、完全な階層パスが文字列であることを前提としています。

たとえば、オブジェクトにフィールド ID (文字列) を持つフィールド クライアント (オブジェクト) を持つフィールド company (オブジェクト) がある場合、このパスは として表されcompany.client.idます。したがって、オブジェクトの値を取得しようとしているフィールドへのパスが与えられた場合、どうすればこれを行うことができますか?

乾杯。

4

3 に答える 3

3

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

}
于 2012-10-21T15:38:19.413 に答える
2

個々の を取得するには、最初に文字列を分割する必要があります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);
}
于 2012-10-21T15:57:20.490 に答える