Отражение универсальный получить значение поля

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

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

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

Как я могу это сделать?

105 голосов | спросил Ido Barash 15 42012vEurope/Moscow11bEurope/MoscowThu, 15 Nov 2012 18:55:24 +0400 2012, 18:55:24

6 ответов


0

Как и раньше, вы должны использовать:

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);
        }
    }
ответил Marius 15 42012vEurope/Moscow11bEurope/MoscowThu, 15 Nov 2012 19:47:11 +0400 2012, 19:47:11
0

Вы должны передать объект в метод get поля , поэтому

  Field field = object.getClass().getDeclaredField(fieldName);    
  field.setAccessible(true);
  Object value = field.get(object);
ответил Dmitry Spikhalskiy 15 42012vEurope/Moscow11bEurope/MoscowThu, 15 Nov 2012 19:02:09 +0400 2012, 19:02:09
0

Я использую отражения в реализации 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();
}

Я надеюсь, что это кому-то поможет, потому что я тоже искал.

ответил silversmurf 6 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 06 Sep 2013 12:55:58 +0400 2013, 12:55:58
0

Хотя мне не совсем понятно, чего вы пытаетесь достичь, я обнаружил очевидную ошибку в вашем коде: Field.get() ожидает объект, который содержит поле в качестве аргумента, а не некоторое (возможное) значение этого поля. Таким образом, вы должны иметь field.get(object).

Поскольку вы, похоже, ищете значение поля, вы можете получить его как:

Object objectValue = field.get(object);

Нет необходимости создавать экземпляр типа поля и создавать пустое значение /значение по умолчанию; или, может быть, я что-то пропустил.

ответил Costi Ciudatu 15 42012vEurope/Moscow11bEurope/MoscowThu, 15 Nov 2012 19:02:07 +0400 2012, 19:02:07
0
 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();
 }
ответил Rahul sharma 3 AM000000100000001131 2016, 10:00:11
0

Вы вызываете get с неверным аргументом.

Должно быть:

Object value = field.get(object);
ответил Seba 15 42012vEurope/Moscow11bEurope/MoscowThu, 15 Nov 2012 19:20:04 +0400 2012, 19:20:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132