2014-12-22 46 views
0

我有一個配置文件是這樣的:如何用java反射填充複合對象?

Provider Search,ConfigURL,http://myUrl

我想用反射

public class MyPrefrences { 

    public ProviderSearch ProviderSearch; 
} 



    public class ProviderSearch { 

     public String ConfigURL; 

    } 

這裏是我的代碼來填充這個對象,但我不能設置複合對象:

MyPrefrences myPrefrences = new MyPrefrences(); 

    try { 
     Field field = myPrefrences.getClass().getDeclaredField(normalizedCategory); 
     Field field2 = field.getClass().getDeclaredField(normalizedKey); 
     field2.set(field, val); 
    } catch (Exception ex) { 
     throw new RuntimeException(ex); 
    } 

你會怎麼做

a)如果所有的葉子成員都是String?

b)如果我的葉子可以是原始的和非原始的?

回答

0

首先,您需要傳遞您想要在field.set()中設置的值的對象引用。

第二:field.getClass()給你java.lang.reflect.Field,使用field.getType()來獲得你需要的Class。 因此,它應該是這樣的

Field field1=myPref.getClass().getDeclaredField("ProviderSearch"); 
Object obj=field1.getType().newInstance(); 
Field field2=field1.getType().getDeclaredField("ConfigURL"); 
field2.set(obj, "www.stackoverflow.com"); 
field1.set(myPref, obj); 
+0

我試過這段代碼,它適用於我。在你的例外configURL以小寫字母'c'開頭,並在getDeclaredField與UpperCase.Check你的字段名稱 –

0

mySeference實例中的providerSearch不能爲null。

MyPrefrences myPrefrences = new MyPrefrences(); 

try { 
    Field field = MyPrefrences.class.getDeclaredField("ProviderSearch"); 
    Field field2 = ProviderSearch.class.getDeclaredField("ConfigURL"); 

    field2.set(field.get(myPrefrences), val); 
} catch (Exception ex) { 
    throw new RuntimeException(ex); 
} 

另外,我建議:

  • 不要使用公共領域。
  • 使用以小寫字母開頭的變量。
  • 使用getters和setter。
+0

仍然未能java.lang.NoSuchFieldException:在這條線configURL:'ProviderSearch.class.getDeclaredField( 「ConfigURL」)'; –

+1

Java區分大小寫。 ConfigURL與configURL不同。檢查你的代碼。 – aabadia