gpt4 book ai didi

java - 设置作为另一个对象的子对象的对象的字段值

转载 作者:行者123 更新时间:2023-12-01 05:46:52 27 4
gpt4 key购买 nike

我遇到以下异常:

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 类开始,我检索名为“owner”的字段 - 然后检索属于汽车一部分的对象所有者的字段“name”。现在我想读取(并稍后修改,但我已经读取失败)字段“name”的值。问题:我只有一个 car 实例,但没有它的字段 "owner"的实例。为了澄清起见:所描述的过程应该通用 - 所以我不知道 getter、setter、字段等的名称。

这是失败的代码(如果需要更多代码来澄清问题,请告诉我):

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 操作它,对象 c 是对象 b 的字段,而对象 b 又是对象 a 的字段...)

如果我可以进一步澄清问题,请告诉我 - 这是检索字段的代码(在上面的示例中是 nameField):

    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

最佳答案

Field 只会为您提供给定类的字段。它不会导航到类并获取子字段。

我建议您使用像这样的普通获取字段助手

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

关于java - 设置作为另一个对象的子对象的对象的字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5706339/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com