Как создать метод single get с параметром для возврата определенного поля [duplicate]

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

100
задан Luiggi Mendoza 3 March 2014 в 10:10
поделиться

6 ответов

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

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);
        }
    }
104
ответ дан Marius 17 August 2018 в 22:49
поделиться
  • 1
    это не совсем верно, что вам нужно итерации через суперклассы самостоятельно. C.getFields () или c.getField () будут автоматически искать поле на каждом интерфейсе реализации и рекурсивно через все суперклассы. Так что достаточно просто переключиться на getX из getDeclaredX. – Przemysław Ładyński 25 November 2015 в 20:50
  • 2
    Действительно, процедура getFields () позволит вам получать поля для всех суперклассов и интерфейсов, но только для публичных. Обычно поля создаются частными / защищенными и подвергаются через геттеры / сеттеры. – Marius 27 November 2015 в 15:49
  • 3
    @Marius, может я знаю, что такое пакет BaseValidationObject? – randytan 9 December 2015 в 11:13
  • 4
    @Randytan, содержащийся в моем личном репозитории кода, вы можете заменить его на Object. То же самое относится к статическим вызовам Logger, заменяет их собственным регистратором (экземпляром). – Marius 9 December 2015 в 16:05
  • 5
    @Marius object класс не имеет метода getMethods(). Есть рекомендации? – randytan 10 December 2015 в 05:51

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

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

Object objectValue = field.get(object);

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

7
ответ дан Costi Ciudatu 17 August 2018 в 22:49
поделиться
  • 1
    спасибо, Это мой первый раз, когда я размышлял, и я пропустил это. – Ido Barash 15 November 2012 в 17:19

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

  Field field = object.getClass().getDeclaredField(fieldName);    
  field.setAccessible(true);
  Object value = field.get(object);
84
ответ дан Dmitry Spikhalskiy 17 August 2018 в 22:49
поделиться
  • 1
    знаете ли вы причину, по которой объект должен использоваться в field.get (object) - само поле исходит от этого объекта, зачем он нужен снова?? – serup 17 June 2016 в 08:19
  • 2
    @serup Нет, объект Field происходит из объекта класса, который не имеет никакого отношения к вашему фактическому экземпляру. (object.getClass() вернет вам этот объект класса) – Dmitry Spikhalskiy 17 June 2016 в 11:43
  • 3
    Да конечно спасибо – serup 21 June 2016 в 11:54
  • 4
    Ты просто спас мне столько времени! – Katie S 4 November 2016 в 22:16
 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();
 }
7
ответ дан Jason 17 August 2018 в 22:49
поделиться
  • 1
    Пожалуйста, добавьте пояснения к вашему коду. – Nander Speerstra 3 August 2016 в 07:23

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

Это должно быть:

Object value = field.get(object);
4
ответ дан Seba 17 August 2018 в 22:49
поделиться

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

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

15
ответ дан silversmurf 17 August 2018 в 22:49
поделиться
Другие вопросы по тегам:

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