2011-07-23 92 views
2
public class foo 
{ 
    private String _name; 
    private String _bar; 

    public String getName() { 
     return _name; 
    } 

    public void setName(String name) { 
     _name = name; 
    } 

    public String getBar() { 
     return _bar; 
    } 

    public void setBarn(String bar) { 
     _bar = bar; 
    } 
} 

如果我有上面的類,我可以使用反射來列出由getters和setters定義的屬性?我試過下面的方法,但它不起作用,Field[] fields被留空。我知道我可以在.Net中做到這一點,但Java是一個非常不同的動物。我完全吠叫了錯誤的樹嗎?Java反射 - 類的屬性(獲取器和設置器)

private HashMap<String, String> getHashMap(Object obj) { 
    HashMap<String, String> map = new HashMap<String, String>(); 

    Class<?> cls = obj.getClass(); 

    Field fields[] = cls.getFields(); 
    for(Field f : fields) { 
     String name = f.getName(); 
     String value = f.get(obj).toString(); 
     map.put(name, value); 
    } 
    return map; 
} 

getter和setter方法也許邪惡的,我應該只是下降呢?

回答

3

也許用cls.getDeclaredFields代替? (和f.setAccessible(true)之前得到私人領域)。

如果你想要getter和setter,你必須得到方法getDeclaredMethods。然後我建議使用BeanUtils而不是編寫自己的反射邏輯:)(恕我直言不太方便的是java.beans.Introspector)。

+0

謝謝zacheusz。這將起作用,但它會列出所有的私人領域,而不僅僅是獲得者和制定者公開的領域。實際上,我的班級將會有更多的_name和_bar。 – Phil

+0

如果你想要getter和setter,你必須通過'getDeclaredMethods'獲取方法。我建議使用[BeanUtils](http://commons.apache.org/beanutils/)來代替;)它可能更好,例如在Java中getters for boolean可以以'is'和'get'開頭。 – zacheusz

+0

這些似乎是最可行的,它實際上是dalvik vm,不幸的是Introspector是不可用的(否則我會去那個)。 – Phil

1

你可以做這樣的事情:

List<Method> methods = Arrays.asList(getClass().getDeclaredMethods()); 
for (Method m : methods) 
{ 
    String name = m.getName(); 
    if (name.startsWith("get") || name.startsWith("is")) 
    { 
     // Do something with the getter method 
    } else if (name.startsWith("set")) 
    { 
     // Do something with the setter method 
    } 
} 
+2

您缺少方法(例如,布爾變量'isXxx')並且包含很多變量(例如,使用參數獲取命名方法以及使用多個參數設置方法)。我會因此不推薦這種方法。 –

+1

和getter for boolean可以用'is'開頭 – zacheusz

+0

感謝您的回答,但這不適合我。例如,如果我有一個有5或6個字段的類,這是非常可行的,那麼我最終會加載if語句。 – Phil

3

使用Introspector類。獲取BeanInfo並使用getPropertyDescriptors()方法。這應該會讓你在路上。

+0

非常好的一點,但是imho比BeanUtils不太方便 – zacheusz

+2

同意,我也會訴諸其他圖書館。有一對夫婦在那裏。例如春天,我們大多數人已經出現在班級的路上。雖然對於stackoverflow,我確實喜歡使用語言原生功能。 –