2012-10-21 11 views
5

私はサブプロパティを含むオブジェクトを持っています。サブプロパティも同様です。階層パスを指定して、フィールドの値を取得します。

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

たとえば、オブジェクトid(String)を持つフィールドclient(Object)を持つフィールドcompany(Object)がある場合、このパスはcompany.client.idと表されます。したがって、私はオブジェクトの値を取得しようとしているフィールドへのパスを与え、私はこれを行うに行くだろうか?

乾杯。

+0

あなたがクラスを知っていますか? – alestanis

+0

反射を使用できます。 –

+0

'Reflection API'で[' Field'](http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Field.html)クラスを使用する必要があります。 –

答えて

2

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

} 
+0

これはトリックを行うよ!歓声 –

+0

あなたのビットプランWebサイトにURLを投稿するもう一つの試みのようです。また、ライセンスを含めるという試みは、最初にここにコンテンツを投稿する際に同意するライセンスに反します。ライセンステキスト/リンクを編集しています。 ** **でそれらを追加しないでください。そうしないと、迷惑メールとして表示されます。 –

+0

Andrew私は、ライセンスのFAQ解釈が著者への直接の参照を削除することを許可していることは明らかではありませんでした。これは私がここでより多くのソースコードを共有する上での障害になります。これを知ってよかったです! –

1

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

あなたはApache Commons BeanUtilsPropertyUtilsBeanを使用することができます。使用の

例:

PropertyUtilsBean pub = new PropertyUtilsBean(); 
Object property = pub.getProperty(yourObject, "company.client.id"); 
関連する問題