getDeclaredField (String) против getMethod (String) для приватных полей в бине - PullRequest
5 голосов
/ 03 сентября 2010

У меня есть бин, свойства которого я хочу получить с помощью отражения. Я получаю имена свойств в виде строки. У bean-компонентов есть методы получения для их личных полей.

В настоящее время я получаю поле с помощью getDeclaredField(fieldName), делаю его доступным с помощью setAccessible(true), а затем извлекаю его значение с помощью get.

Еще один способ сделать это - использовать имя поля с заглавной буквы и добавить get в начало, а затем получить метод по этому имени из класса и, наконец, вызвать метод для получения значения приватного поле.

Какой способ лучше?

EDIT

Возможно, мне следует объяснить, что я имею в виду под «лучше» ... под «лучше» я имею в виду лучшие практики. Или, если есть какие-то тонкие предостережения или различия.

Ответы [ 4 ]

2 голосов
/ 03 сентября 2010

Возможно, вы захотите взглянуть на класс Introspector, это хорошая оболочка, если вы хотите иметь дело только со свойствами, которые были выставлены, вы можете получить BeanInfo объект и затем вызовите getPropertyDescriptors(), например:

final BeanInfo info = Introspector.getBeanInfo(clazz);
for (PropertyDescriptor prop : info.getPropertyDescriptors()) {
    final Method read = prop.getReadMethod();
    if (read != null) {
        // do something
    }
}
1 голос
/ 03 сентября 2010

Возможно использование метода get, поскольку он может иметь дополнительное поведение помимо простого возврата значения свойства.Однако это зависит от класса.

1 голос
/ 03 сентября 2010

Это зависит от вашего использования, но в целом я бы предпочел использовать геттер, поскольку это «нормальный» способ, и в большинстве случаев он будет делать то, что ожидает разработчик класса.

В принципе, если разработчик класса сделал поле приватным, он может делать все, что ему заблагорассудится, например, удалить его позже, если он может быть рассчитан другим способом. Тогда доступ к полю прекратится, надеюсь, немедленно, если вам не повезет через 3 месяца, когда никто больше не помнит.

Обратите внимание, что есть библиотеки вроде apache commons BeanUtils (я думаю, что есть и в Spring), которые делают это для вас и предлагают более разумный интерфейс, например, хэш-карту.

0 голосов
/ 03 сентября 2010

Лучше, чем?

Вы можете написать 20-строчный модульный тест, чтобы увидеть, какой из них быстрее. Вы можете написать оба и посмотреть на них, чтобы увидеть, что легче читать. Если один из способов легче читать и быстрее, сделайте это. Если нет, вам придется забрать свой яд ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...