Java getter для несуществующего атрибута класса - PullRequest
1 голос
/ 13 марта 2012

Я использую некоторые функции в Java, которые мне не совсем понятны, поэтому я хочу ознакомиться с ними, чтобы я мог использовать их более эффективно.Проблема в том, что я не знаю, как он называется, поэтому мне трудно получить больше информации о нем:

У меня есть класс Foo, определенный следующим образом:

private String _name;
private Bar _bar;
//getters and setters

И Bar:

private String _code;

//getters and setters

public String get_isCodeSmith()
{
      boolean rVal =  _code.toLowerCase().contains("smith");        
      return rVal;
}

Каким-то образом на моих страницах JSP (когда у меня есть переменная Session с именем Foo), я могу написать логические теги, подобные этому:

<logic:equal name="Foo" property="_bar._isCodeSmith" value="true">

И хотя в моем классе Bar нет атрибута _isCodeSmith, он автоматически запускает метод get_isCodeSmith().

Как это называется и где я могу узнать больше?

Ответы [ 2 ]

6 голосов
/ 13 марта 2012

Это механизм Javabeans .Свойства определяются не полями, а методами getter (accessor) и / или setter (mutator).

Для получения дополнительной технической информации прочитайте спецификацию JavaBeans

иливзгляните на этот простой тестовый класс:

public class TestBean {

    private String complete;
    public String getComplete() { return complete; }
    public void setComplete(final String complete) { this.complete = complete; }

    private String getterOnly;
    public String getGetterOnly() { return getterOnly; }

    private String setterOnly;
    public void setSetterOnly(final String setterOnly) { this.setterOnly = setterOnly; }

    public String getNoBackingField() { return ""; }

}

и простой анализ JavaBeans:

public class Test {
    public static void analyzeBeanProperties(final Class<?> clazz) throws Exception {
        for (final PropertyDescriptor propertyDescriptor
                : Introspector.getBeanInfo(clazz, Object.class).getPropertyDescriptors()) {
            System.out.println("Property name: " + propertyDescriptor.getName());
            System.out.println("Getter method: " + propertyDescriptor.getReadMethod());
            System.out.println("Setter method: " + propertyDescriptor.getWriteMethod());
            System.out.println();
        }
    }

    public static void main(final String[] args) throws Exception {
        analyzeBeanProperties(TestBean.class);
    }
}

Вывод:

Property name: complete
Getter method: public java.lang.String test.bean.TestBean.getComplete()
Setter method: public void test.bean.TestBean.setComplete(java.lang.String)

Property name: getterOnly
Getter method: public java.lang.String test.bean.TestBean.getGetterOnly()
Setter method: null

Property name: noBackingField
Getter method: public java.lang.String test.bean.TestBean.getNoBackingField()
Setter method: null

Property name: setterOnly
Getter method: null
Setter method: public void test.bean.TestBean.setSetterOnly(java.lang.String)
1 голос
/ 13 марта 2012
<logic:equal name="Foo" property="a.b.c" value="true">

означает Foo.getA (). GetB (). GetC ()

. Не имеет значения, существуют ли поля.Обязательны только добытчики.

...