2016-08-19 31 views
2

我寫了使用Java內部檢查的方法,但我發現,當二傳手/ getter方法是靜態這是行不通的!java Introspector沒有找到靜態屬性或實際上靜態的getter/setter方法?

public class Bean { 

    public static String foo; 

    public String bar; 

    public static String fooBar; 

    public static String getFoo() { 
     return foo; 
    } 

    public static void setFoo(String foo) { 
     Bean.foo = foo; 
    } 

    public String getBar() { 
     return bar; 
    } 

    public void setBar(String bar) { 
     this.bar = bar; 
    } 

    public String getFooBar() { 
     return fooBar; 
    } 

    public void setFooBar(String fooBar) { 
     Bean.fooBar = fooBar; 
    } 
} 

而且

public static void main(String[] args) throws Exception { 

     BeanInfo beanInfo = Introspector.getBeanInfo(Bean.class); 
     PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); 
     for(PropertyDescriptor propertyDescriptor : propertyDescriptors){ 
      System.out.println(propertyDescriptor.getName()); 
     } 

    } 

上面運行的代碼返回爲如下:

bar 
class 
fooBar 

它只返回欄和foorBar

這是否意味着內部檢查器沒有找到靜態屬性或實際上是getter/setter方法?

回答

2

打印propertyDescriptor對象而不是它的名稱,您可以看到它查看了bean類上的方法。

Javadoc說: 如果我們沒有在類上找到顯式BeanInfo,我們使用低級反射來研究類的方法,並應用標準設計模式來標識屬性訪問器,事件源或公共方法

因此推測「標準設計模式」是指非靜態訪問器。也就是說,它尋找public void setXXX(T)public T getXXX()方法。

+0

謝謝你;是我的問題.. http://stackoverflow.com/q/40852452/294884相關? – Fattie