Значение генерирующего поля отражения
Я пытаюсь получить значение поля через отражение. Проблема в том, что я не знаю тип полей и должен решить его при получении значения.
Этот код приводит к этому исключению:
Невозможно установить поле java.lang.String com.... fieldName в java.lang.String
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
Class<?> targetType = field.getType();
Object objectValue = targetType.newInstance();
Object value = field.get(objectValue);
Я попытался выполнить бросок, но я получаю ошибки компиляции:
field.get((targetType)objectValue)
или
targetType objectValue = targetType.newInstance();
Как я могу это сделать?
Ответы
Ответ 1
Как и раньше, вы должны использовать:
Object value = field.get(objectInstance);
Другой способ, который иногда предпочитается, вызывает динамический геттер. пример кода:
public static Object runGetter(Field field, BaseValidationObject o)
{
// MZ: Find the correct method
for (Method method : o.getMethods())
{
if ((method.getName().startsWith("get")) && (method.getName().length() == (field.getName().length() + 3)))
{
if (method.getName().toLowerCase().endsWith(field.getName().toLowerCase()))
{
// MZ: Method found, run it
try
{
return method.invoke(o);
}
catch (IllegalAccessException e)
{
Logger.fatal("Could not determine method: " + method.getName());
}
catch (InvocationTargetException e)
{
Logger.fatal("Could not determine method: " + method.getName());
}
}
}
}
return null;
}
Также помните, что когда ваш класс наследуется от другого класса, вам нужно рекурсивно определить поле. например, для извлечения всех полей данного класса;
for (Class<?> c = someClass; c != null; c = c.getSuperclass())
{
Field[] fields = c.getDeclaredFields();
for (Field classField : fields)
{
result.add(classField);
}
}
Ответ 2
Вы должны передать объект, чтобы получить метод поля, поэтому
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
Object value = field.get(object);
Ответ 3
Я использую отражения в реализации toString() моего класса предпочтений, чтобы видеть члены класса и значения (простая и быстрая отладка).
Упрощенный код, который я использую:
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
Class<?> thisClass = null;
try {
thisClass = Class.forName(this.getClass().getName());
Field[] aClassFields = thisClass.getDeclaredFields();
sb.append(this.getClass().getSimpleName() + " [ ");
for(Field f : aClassFields){
String fName = f.getName();
sb.append("(" + f.getType() + ") " + fName + " = " + f.get(this) + ", ");
}
sb.append("]");
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
}
Я надеюсь, что это поможет кому-то, потому что я также искал.
Ответ 4
Хотя мне не совсем ясно, чего вы пытаетесь достичь, я обнаружил очевидную ошибку в вашем коде:
Field.get()
ожидает объект, который содержит поле в качестве аргумента, а не некоторое (возможное) значение этого поля. Поэтому вы должны иметь field.get(object)
.
Поскольку вы, кажется, ищете значение поля, вы можете получить это как:
Object objectValue = field.get(object);
Не нужно создавать экземпляр типа поля и создавать пустое значение/значение по умолчанию; или, может быть, там что-то я пропустил.
Ответ 5
Integer typeValue = 0;
try {
Class<Types> types = Types.class;
java.lang.reflect.Field field = types.getDeclaredField("Type");
field.setAccessible(true);
Object value = field.get(types);
typeValue = (Integer) value;
} catch (Exception e) {
e.printStackTrace();
}
Ответ 6
Вы вызываете get с неправильным аргументом.
Это должно быть:
Object value = field.get(object);