Значение генерирующего поля отражения

Я пытаюсь получить значение поля через отражение. Проблема в том, что я не знаю тип полей и должен решить его при получении значения.

Этот код приводит к этому исключению:

Невозможно установить поле 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);