2013-03-07 35 views
0

我想通過名稱memberName訪問一個Object對象的屬性。java introspection找到類的成員

我想:

new PropertyDescriptor(memberName,object.getClass()).getReadMethod().invoke(object); 

它非常適合我的大多數對象的屬性。但其中一些是布爾值,getter的形式是'isValid'而不是'getValid',上面的代碼會產生一個IntrospectionException錯誤。

我可以做些什麼來使這項工作,如果可能的話,而不使用更多的代碼/外部庫?


編輯:

是對不起,我忘了提,我班的成員的名字也許是選擇不當。它已經是'布爾isValid',並且getter也是'isValid'。

+0

你可以看到如果標準閱讀器存在,並且不存在,則檢查布爾風格的閱讀器。或者檢查會員的類型並傳入正確的名字。 – 2013-03-07 14:25:37

+0

它適用於我,在Java 6.你可以發佈[SSCCE](http://sscce.org)? – 2013-03-07 14:26:58

回答

2

它正常工作對我來說,這是documented認爲這就是它的意思的工作:

構建了通過getFoo和setFoo存取方法,爲符合標準Java約定的屬性構造一個PropertyDescriptor。因此,如果參數名稱是「fred」,它將假定writer方法是「setFred」,讀取器方法是「getFred」(或布爾屬性的「isFred」)。請注意,屬性名稱應以小寫字符開頭,該字符將在方法名稱中大寫。

(重點煤礦)

示例代碼:

import java.beans.*; 

public class Test { 

    public static void main(String[] args) throws Exception { 
     Test test = new Test(); 
     PropertyDescriptor pd = new PropertyDescriptor("checked", Test.class); 
     System.out.println(pd.getReadMethod().invoke(test)); 
    } 

    public boolean isChecked() { 
     System.out.println("isChecked called!"); 
     return true; 
    } 

    public void setChecked(boolean checked) { 
    } 
} 

我建議你試試我的示例代碼,以及是否適合你再看看你能不能找到我的代碼之間的差異和你的代碼。

+0

看我的編輯.... – Car981 2013-03-07 14:54:12

+0

@ Car981:那麼,我建議你修復你的課程。如果您將變量更改爲「有效」,是否解決了這個問題?另外,變量是否是私人的? – 2013-03-07 15:42:20

+0

有沒有辦法避免更改變量名稱? – Car981 2013-03-07 16:50:31

0

如果你想訪問的屬性是公共的,你可以做如下

object.getClass().getDeclaredField(name) 

如果屬性是私有的,你可以訪問它,使它入店有:

object.getClass().getDeclaredField(name).setAccessible(true); object.getClass().getDeclaredField(name); 
+0

可能是因爲如果該字段是私有的(可能是,如果有getter),那麼您無法獲取該值而不拋出IllegalAccessException。 – 2013-03-07 14:28:59