Java Reflection - 列出类的属性(getter& setters)

时间:2011-07-23 12:27:48

标签: java android reflection

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

同样 setter和getter也许是邪恶的,我应该放弃吗?

3 个答案:

答案 0 :(得分:3)

也许使用cls.getDeclaredFields代替? (在获取私有字段之前f.setAccessible(true)。)

如果你想要getter和setter,你必须通过getDeclaredMethods获得方法。然后我建议使用BeanUtils而不是编写自己的反射逻辑:)(恕我直言不太方便的是java.beans.Introspector)。

答案 1 :(得分:3)

使用Introspector课程。获取BeanInfo并使用getPropertyDescriptors()方法。这应该让你在路上。

答案 2 :(得分: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
    }
}