2014-05-07 106 views
2

我是新的反射,我试图得到一个嵌套字段。总结我有以下类别:如何获得嵌套字段

public class Agreement{ 

    private Long id; 

    private String cdAgreement; 

    private Address address; 

    //Constructor getter and setter 

} 

public class Address{ 

    private Long id; 

    private String description; 

    //Constructor getter and setter 

} 

现在我想说明字段,然后我写了这个代码:

Agreement agreement = new Agreement(); 
Class c = agreement.getClass(); 
Field f = c.getDeclaredField("address.descritpion"); 

而不是作品,我得到以下异常:

java.lang.NoSuchFieldException: address.descritpion 
at java.lang.Class.getDeclaredField(Class.java:1948) 

我在哪里做错了?

回答

3

目前的问题是没有字段的名称为“address.description”(它甚至不是字段的有效名称)。

您必须首先获取地址字段,访问其类并从此处获取嵌套字段。要做到这一点,使用getType()

Agreement agreement = new Agreement(); 
Class c = agreement.getClass();   // Agreement class 
Field f = c.getDeclaredField("address"); // address field 
Class<?> fieldClass = f.getType();  // class of address field (Address) 
Field nested = fieldClass.getDeclaredField("description"); // description field 

你也可以连接呼叫无局部变量:

Field nested = c.getDeclaredField("address").getType().getDeclaredField("description"); 
0

必须分解操作。

Agreement agreement = new Agreement(); 
Field fAddress = agreement.getClass().getDeclaredField("address"); 
Address address = (Address)fAddress.get(agreement); 
Field fDescription = address.getClass().getDeclaredField("description"); 
String description = (String)fDescription.get(address); 
+1

您不需要获取字段的值,只需获取其Class。而且,这可能会在调用'getClass()'时抛出NPE。 – Joffrey

+0

是的,你是对的。太仓促了。你的回答是对的。 – cadrian