2012-03-13 12 views
1

私は実際に理解していないJavaの機能をいくつか使用していますので、より効果的に使用できるように読みたいと思います。クラスの存在しない属性のJavaゲッター

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

そしてBar

私はこのように定義されたクラス Fooを持って

:問題は、それはそれは難しいことでより多くの情報を入手することができますので、私はそれが呼び出されるかわからないということです

:私のJSPページ(私は Fooと呼ばれる Session変数を持っている場合)私はこのようなロジックタグを記述することができる午前中に何とか
private String _code; 

//getters and setters 

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

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

_isCodeSmithはクラスBarにありませんが、自動的にget_isCodeSmith()メソッドが実行されます。

これは何と呼ばれ、どこで詳細を見つけることができますか?

答えて

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) 
+0

ありがとうございます。非常に徹底的な答え。 – Rondel

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

は、フィールドが存在する場合

は関係ありませんFoo.getA()。getB()。getc関数を()を意味します。ゲッターだけが必須です。

関連する問題