Java getter用于类的不存在的属性

时间:2012-03-13 17:34:07

标签: java struts-1

我在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的{​​{1}}变量)时,我能够编写如下逻辑标记:

Foo

即使我的班级<logic:equal name="Foo" property="_bar._isCodeSmith" value="true"> 中没有属性_isCodeSmith,它也会自动运行Bar方法。

这叫什么,我在哪里可以找到更多?

2 个答案:

答案 0 :(得分:6)

这是Javabeans mechanism。属性不是通过字段标识,而是通过getter(访问器)和/或setter(mutator)方法标识。

有关更多技术信息,请阅读JavaBeans spec

或者看看这个简单的测试类:

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 :(得分:1)

<logic:equal name="Foo" property="a.b.c" value="true">

表示Foo.getA()。getB()。getC()

如果字段存在则无关紧要。只有吸气剂是强制性的。