如何获取类的所有属性?

时间:2014-01-03 07:53:22

标签: java

我想获取类实例的所有属性的名称和值。该类可以是任何定制的任何类,它也可以具有对象列表,散列映射,表等,并且可以从另一个类中扩展。实际上我的意思是我想得到一个班级的所有attr的名称和价值。所以我需要做的就是模板。可能吗?到目前为止我已经写过了。任何建议将不胜感激。

    public static void getObjectIntoMap(Object obj) throws IllegalArgumentException, IllegalAccessException {
    Field[] field = obj.getClass().getDeclaredFields();
    Class<?> c = obj.getClass().getSuperclass();
    if(c != Object.class)
        getObjectIntoMap(c.getClass());
    System.out.println("SSS : "+field.length);
    for (Field f : field) {
        if(f.getType() == java.util.List.class){
            java.util.List<Object> ll = (java.util.List<Object>) f.get(obj);
            for (Object o : ll) {
                Field[] ff = o.getClass().getDeclaredFields();
                for (Field field2 : ff) {
                    print(field2.getName(), field2.get(o).toString());
                }
            }
        }else if(f.getType() == Hashtable.class){

        }
        else if(f.getType() == HashMap.class){

        }else if(f.getType() == Object[].class){

        }   
        else{
            print(f.getName(), f.get(obj).toString());
        }
    }
}

3 个答案:

答案 0 :(得分:4)

try http://code.google.com/p/reflections/ ReflectionUtils.getAllFields返回一组包含所有超类型字段的所有类字段。现在我们只需迭代它们并读取实例字段值:

  Set<Field> fields = ReflectionUtils.getAllFields(X.class, new Predicate() {
    public boolean apply(Object input) {
        return true;
    }});
   Map<Field, Object) values = ...
   for(Field f : fields) {
        f.setAccessible(true);
        values.put(f, f.get(obj);
    }

答案 1 :(得分:0)

使用#getDeclaredFields()包含私有字段,#getFields()用于公共字段。

有私有字段,由于限制,也请参考#setAccessible()方法。

答案 2 :(得分:0)

只是一个快速的附录:

if(f.getType() == Object[].class

这可能不是你想要的(我猜你要检测所有数组,而不仅仅是Object []类型的数组)。相反,你会想要使用这样的东西:

if(f.getType().getComponentType()!=null)

或者,如果你想要各种对象数组,包括例如String [],但没有原始数组,那么你可以这样做:

if(Object[].class.isAssignableFrom(f.getType()))

除此之外,还有更多标准化的方法可以做你想做的事情,我在之前的答案中已经展示过。你可以: