Лучший способ вызвать геттера отражением

Вам нужно сделать это (на основе предыдущего ответа):

public function getAllCategoryAction() {
    $em = $this->getDoctrine()->getManager();
    $query = $em->createQuery(
        'SELECT c
        FROM AppBundle:Categoria c'
    );
    $categorias = $query->getArrayResult();

    $response = new Response(json_encode($categorias));
    $response->headers->set('Content-Type', 'application/json');

    return $response;
}

Он отлично работает с любым запросом, который Doctrine возвращает как массив.

121
задан Carl Manaster 14 April 2010 в 15:16
поделиться

2 ответа

Думаю, это должно направить вас в нужную сторону:

import java.beans.*

for (PropertyDescriptor pd : Introspector.getBeanInfo(Foo.class).getPropertyDescriptors()) {
  if (pd.getReadMethod() != null && !"class".equals(pd.getName()))
    System.out.println(pd.getReadMethod().invoke(foo));
}

Обратите внимание, что вы можете создавать экземпляры BeanInfo или PropertyDescriptor самостоятельно, т.е. без использования Introspector. Однако Introspector делает некоторое внутреннее кэширование, что обычно является хорошей вещью (tm). Если вы счастливы без кэша, то можете даже обойтись

// TODO check for non-existing readMethod
Object value = new PropertyDescriptor("name", Person.class).getReadMethod().invoke(person);

Однако существует множество библиотек, расширяющих и упрощающих API java.beans. Commons BeanUtils - хорошо известный пример. Там вы просто сделаете:

Object value = PropertyUtils.getProperty(person, "name");

BeanUtils поставляется с другими удобными вещами. Например, преобразование значений "на лету" (объект в строку, строка в объект) для упрощения установки свойств из пользовательского ввода.

228
ответ дан 24 November 2019 в 01:23
поделиться

Соглашение об именовании является частью устоявшейся спецификации JavaBeans и поддерживается классами из пакета java.beans.

4
ответ дан 24 November 2019 в 01:23
поделиться
Другие вопросы по тегам:

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