2011-04-18 71 views
1

我收到以下異常的孩子:設置對象的字段值是另一個對象

java.lang.IllegalArgumentException異常:對象不是類的實例

而且我對於爲何獲得它有一個很好的想法 - 但我一直在尋找解決方案。

下面是示例代碼來解釋什麼,我想做的事:

public class Car { 
    private Owner owner; 

    //Constructor and getter for owner field 
} 

public class Owner { 
    private String name; 

    //Constructor and getter for name field 
} 

現在什麼,我試圖做的是:從Car類開始,我取回了名爲「老闆」的領域 - 然後我檢索作爲汽車一部分的對象所有者的字段「名稱」。現在我想閱讀(後來修改,但我已經失敗並閱讀)字段「name」的值。問題:我只有一輛汽車的實例,但不是它的領域「所有者」。爲了澄清目的:所描述的過程應該一般地工作 - 所以我不知道吸氣劑,製劑者,領域等的名稱。

這裏是一個失敗的代碼(請讓我知道,如果需要更多的代碼,以澄清問題):

Car car = new Car(); 
//Set owner and name property of owner for car 
... 
Field nameField = resolveDatapath(datapathToFeature, car); 
nameField.setAccessible(true); 
//Here I fail with the afore mentioned IllegalArgumentException, because 
//indeed, I am passing car - not its sub-object "owner" (because as I can see it, 
//there is no way for me to generically retrieve the owner object - or is there?) 
String value = nameField.get(car).toString(); 

上面的東西也應該對任何「深處」的工作(比如我想現場並從對象c,這是一個對象b的領域,這又是一個對象a的領域操縱它...)

請讓我知道,如果我可以進一步澄清問題 - 這裏是代碼檢索該字段(在上面的示例中爲其名稱字段):

private Field resolveDatapath(String path, Object parent) { 
    String subString = path; 
    if (!subString.contains(".")) 
    { 
     //We haven reached the end of the path 
     return getField(subString, parent.getClass()); 
    }  

    //We haven't reached the end of the 
    subString = path.substring(0, path.indexOf(".")); 
    Field field = getField(subString, parent.getClass()); 

    return resolveDatapath(path.substring(path.indexOf(".")+1), field); 
} 

private Field getField(String name, Class<?> parent) { 
    Field [] fields = parent.getDeclaredFields(); 

    for(Field f : fields) 
    {   
     String current = f.getName(); 
     if(current.equalsIgnoreCase(name)) 
     { 
      try { 
       return parent.getDeclaredField(current); 
      } catch (SecurityException e) { 
       fail("Not allowed to access field - " + current); 
      } catch (NoSuchFieldException e) { 
       fail("No such field exists - " + current); 
      } 
     } 
    } 
    return null; 
} 

非常感謝你提前, 最好的問候, Ready4Android

回答

0

好感謝彼得給了我的大腦捅它需要;)我找到了解決方案,那就是:

我創建一個包含字段和父對象作爲對象的DatapathObject。在我接受合作之前,我無法獲得Car對象中字段的Owner對象的實例。當然,正如我現在所認爲的那樣,這是胡說八道 - 我的大腦在這裏變得有些緩慢:P。

此代碼的工作,使我的單元測試通:

public void testDatapathResolution() throws Exception{ 
    String[] path = datapathToFeature.split("\\."); 
    assertEquals("Owner", path[0]); 
    assertEquals("Name", path[1]); 
    DatapathObject result = resolveDatapath(datapathToFeature, car); 
    result.getField().setAccessible(true); 
    Object value = result.getField().get(result.getParent()); 

    assertEquals(car.getOwner().getName(), value.toString()); 
} 

這裏是DatapathObject類:chanded如下

public class DatapathObject { 
    private Object parent; 
    private Field field; 

    public DatapathObject(Object parent, Field field) { 
    this.parent = parent; 
    this.field = field; 
    } 

    public Object getParent() { 
    return parent; 
    } 

    public Field getField() { 
    return field; 
    } 
} 

我resolveDatapath方法(以適應引進DatapathObject的:

private DatapathObject resolveDatapath(String path, Object parent) throws 
    IllegalArgumentException, IllegalAccessException 
{ 
    String subString = path; 
    if (!subString.contains(".")) 
    { 
     //We haven reached the end of the path 
     Field field = getField(subString, parent.getClass()); 
     return new DatapathObject(parent, field); 
    }  

    //We haven't reached the end of the 
    subString = path.substring(0, path.indexOf(".")); 
    Field field = getField(subString, parent.getClass()); 
    field.setAccessible(true); 
    return resolveDatapath(path.substring(path.indexOf(".")+1), 
      field.get(parent)); 
} 

再次感謝Peter-lol我還是不明白你的答案,我不認爲這是我一直在尋找,但它提供了我的大腦缺少火花找到答案:)!

0

實地只會給你一個給定的類的字段。它不會導航到類並獲取子字段。

我建議,而不是你使用一個普通的GET場幫手這樣

String name = (String) getField(car, datapathToFeature); 
+0

感謝您的建議 - 但我不知道我完全理解你的答案:) ......我已經是路徑,我需要像場:Car.Owner.Name(所有者類名稱字段,在汽車類中的字段) - 我的問題是設置和獲取name字段的值,因爲我沒有父對象作爲一個實例(我只能檢索它作爲一個字段)哎......哈哈而我寫這篇我有另一個想法......我會回來的更新:) – Ready4Android 2011-04-19 13:36:02

相關問題