簡體   English   中英

Java Reflection-列出類的屬性(獲取器和設置器)

[英]Java Reflection - listing properties (getters & setters) of a class

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;
    }
}

如果我有上述課程,是否可以使用反射列出由getter和setter定義的屬性? 我嘗試了下面的方法,但是它不起作用, Field[] fields保留為空。 我知道我可以在.Net中做到這一點,但是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;
}

此外,設置者和獲取者也許是邪惡的,我應該丟掉這個嗎?

也許改用cls.getDeclaredFields嗎? (和f.setAccessible(true)之前獲取私有字段)。

如果需要getter和setter,則必須通過getDeclaredMethods獲取方法。 然后,我建議使用BeanUtils而不是編寫自己的反射邏輯:)(恕我直言,不方便的是java.beans.Introspector )。

使用Introspector類。 獲取BeanInfo並使用getPropertyDescriptors()方法。 那應該使您順利進行。

你可以這樣做:

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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM