Свойства Java Bean определяются методами, а не полями. По этой причине класс PropertyDescriptor
имеет методы getReadMethod()
и getWriteMethod()
, но методов getField()
нет.
Лично я думаю, что ваш коллега использует плохую практику.
а) is
- глагол. Поля не должны быть названы в честь глаголов.
б) хотя это и не требуется, хорошей практикой является именование поля как свойства, что позволяет писать код следующим образом:
PropertyDescriptor pd; // let's assume this is set
Method referenceMethod = pd.getReadMethod() == null
// at least one of these is not null
? pd.getWriteMethod() : pd.getReadMethod();
Field underLyingField = referenceMethod
.getDeclaringClass()
.getDeclaredField(pd.getName());
Хотя этот код не стандартизирован, он следует соглашениям и может оказаться очень удобным. Если вы не следуете подобным соглашениям, у вас не будет возможности связать поле со свойством (это преднамеренно, я знаю).
например. Я использую код, подобный приведенному выше, чтобы проверить, есть ли в поле аннотации
Об индексированных свойствах:
Вы можете использовать синтаксис индекса для свойств массива или списка (или карты), но только если они определены как стандартные свойства bean.
Итак, если у вас есть такая собственность:
private String[] bar;
public String[] getBar(){
return bar;
}
public void setBar(String[] bar){
this.bar = bar;
}
или как это:
private List<String> bar;
public List<String> getBar(){
return bar;
}
public void setBar(List<String> bar){
this.bar = bar;
}
вы можете получить доступ к первому члену с выражением ${bar[0]}
И с таким свойством карты:
private Map<String, String> bar;
public Map<String, String> getBar(){
return bar;
}
public void setBar(Map<String, String> bar){
this.bar = bar;
}
Вы можете получить доступ к значению, сопоставленному с "baz"
следующим образом ${bar['baz']}
.
Эта функциональность основана на стандартной функциональности bean-компонентов, поэтому для нее требуются обычные методы получения / установки.