Я получаю следующее исключение:
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» этого владельца объекта, который является частью автомобиля. Теперь я хочу прочитать (и позже изменить, но у меня уже не получается читать) значение поля «имя». Проблема: у меня есть только экземпляр автомобиля, а не его поле "владелец". Для пояснения: описанный процесс должен работать в общем случае, поэтому я не буду знать имена получателей, установщиков, полей и т. Д.
Вот код, который не работает (пожалуйста, дайте мне знать, если для выяснения проблемы требуется больше кода):
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 ...)
Пожалуйста, дайте мне знать, если я могу уточнить вопрос - вот код, который извлекает поле (в приведенном выше примере это 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