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