2016-11-26 1 views
3

Я получение информации о классе черезПочему PropertyDescriptor возвращает имя свойства с верхним регистром в качестве первого символа?

Introspector.getBeanInfo(this.getClass()).getPropertyDescriptors() 

затем получить имя свойства, вызывая propery[i].getName().

Все в порядке, если в собственности нет однобуквенной части. Например, если свойство имеет имя personAddress (между тем его получатель/сеттер ->getPersonAddress(), setPersonAddress(String personAddress)), это нормально, getName() возвращает personAddress.

Но если свойство имеет имя rPersonId (getRPersonId(), setRPersonId(Long rPersonId)), то getName() возвращается «RPersonId», то есть первая буква была заглавной! Зачем?

По https://docs.oracle.com/javase/7/docs/api/java/beans/FeatureDescriptor.html:

public String getName() -> Получает программное имя этой функции.

Так почему же оно возвращает имя, как-то связанное с его именем получателя или сеттера вместо реального имени свойства?

ответ

0

Потому что это часть религии.

Люди, которые делали Java Beans, чувствовали, что к этим свойствам следует ВСЕГДА обращаться с помощью пары методов. Таким образом, вы НЕ получаете имя члена данных. Вы получаете свойство, к которому могут обращаться только методы.

Это из документации:

A PropertyDescriptor describes one property that a Java Bean exports 
via a pair of accessor methods. 

https://docs.oracle.com/javase/7/docs/api/java/beans/PropertyDescriptor.html

Теория была вы никогда не должны использовать имя элемента данных, и поэтому через интерфейс Bean, они не дают вам это.

+0

Ответ не объясняет, почему первый символ не был в нижнем регистре. – Tunaki

+0

Спасибо за ответ! –

+0

Благодарим за отзыв! Эта ссылка https://docs.oracle.com/javase/7/docs/api/java/beans/PropertyDescriptor.html говорит, что PropertyDescriptor имеет несколько конструкторов. Какой из них вызывается вызовом getBeanInfo (this.getClass()). GetPropertyDescriptors()? Он говорит только, что если я сам создам PropertyDescriptor, тогда я должен предоставить пару getter/setter –

2

Это фактически документированное поведение.

Прежде всего, имена свойств полностью расположены, открывая их приемник и сеттер, а не глядя на поля этого класса. Это указано в пункте 8.3 Java Beans specification:

Если мы открываем подходящую пару get<PropertyName> и set<PropertyName> методов, которые принимают и возвращают один и тот же тип, то мы рассматриваем эти методы, как определение свойства чтения-записи, имя которого будет be <propertyName>.

Так что, когда у вас есть самоанализ класса, который содержит Long getRPersonId() и setRPersonId(Long), свойство может быть извлечена из него. Название свойства обычно следует из нижней части первой буквы и остальное без изменений. Но это не всегда так, точное правило содержится в параграфе 8.8:

Таким образом, когда мы извлекаем свойство или имя события из середины существующего Java-имени, мы обычно конвертируем первый символ в нижний регистр.Однако, чтобы поддерживать случайное использование всех имен верхнего регистра, мы проверяем, являются ли первые два символа имени верхним регистром, и если да, оставьте его в покое. Так, например:

  • FooBah становится fooBah
  • Z становится z
  • URL становится URL

Мы предлагаем метод Introspector.decapitalize, который реализует это правило преобразования.

В приведенном выше примере геттер и сеттер предоставили строку , чтобы перейти в название свойства. Так как первые два символа являются верхним регистром, первый символ не будет одинарным. Таким образом, имя свойства, которое будет выведено, равно RPersonId, и это объясняет ваш результат.

Вы также можете вызвать метод decapitalize, чтобы увидеть, какое свойство имя будет находиться от пары геттер/сеттер:

System.out.println(Introspector.decapitalize("RPersonId"));  // prints RPersonId 
System.out.println(Introspector.decapitalize("PersonAddress")); // prints personAddress