获取Java类/对象的私有属性列表

时间:2011-11-10 22:50:34

标签: java reflection

如何获取getter和setter中使用的Java对象的所有私有属性的列表。我试过PropertyUtilsMethodUtils,但没有运气。现在我正在尝试使用Class对象的getDeclaredFields(),它返回一个Field对象列表,然后检查这是否是私有属性是一种方法?或者有更好的解决方案。

4 个答案:

答案 0 :(得分:1)

你说的话,或者yourBean.getClass().getMethods() 然后在返回的每个方法上method.getName().startsWith("get")

我可以问你为什么需要这样做吗?

答案 1 :(得分:1)

您可以查找所有的getter和setter,并查看是否有匹配的字段。但是字段可以从_fieldNamem_fieldName开始。您只能推断出getter / setter与字段有关。

答案 2 :(得分:0)

我这样做:

private Set<String> getModelProperties(Class<T> cls) {
    Set<String> properties = new HashSet<String>();
    for (Method method : cls.getDeclaredMethods()) {
        String methodName = method.getName();
        if (methodName.startsWith("set")) {
            properties.add(Character.toLowerCase(
              methodName.charAt(0)) + methodName.substring(3));
        }
    }

    return properties;
}

答案 3 :(得分:0)

这是一个很老的问题,但我会在这里为新的搜索提供答案。

使用@highlycaffeinated提供的方法:https://stackoverflow.com/a/6796254/776860

您可以通过一些更改轻松找到所需的解决方案。

仅检索私人字段名称列表

public List<String> getMap(Object o) throws IllegalArgumentException, IllegalAccessException {
    List<String> result = new ArrayList<String>();
    Field[] declaredFields = o.getClass().getDeclaredFields();
    for (Field field : declaredFields) {
        if(!field.isAccessible()) {
            result.add(field.getName());
        }
    }
    return result;
}

检索所有字段名称及其值的地图

public Map<String, Object> getMap(Object o) throws IllegalArgumentException, IllegalAccessException {
    Map<String, Object> result = new HashMap<String, Object>();
    Field[] declaredFields = o.getClass().getDeclaredFields();
    for (Field field : declaredFields) {
        field.setAccessible(true);
        result.put(field.getName(), field.get(o));
        } 
    }
    return result;
}

正如@highlycaffeinated一样,只提供额外的行field.setAccessible(true);,这样您就可以内省private字段。