列出对象的所有名称和值

时间:2014-02-27 16:53:10

标签: java reflection

有没有办法可以打印Object Object可以属于任何级别的所有名称和值?

如果ObjectPersonPerson有成员变量Integer age; - 我需要方法可以接收Object的实例(在这种情况下ObjectPerson但可以是任何其他类型的对象)并打印age - 35 age }是成员变量name35value

类似的东西:

public Map<String, String> getNamesAndValues(Object object) {
  Map<String, String> namesAndValues = new HashMap<>();
  //Populate namesAndValues Map here using object in signature.
  return namesAndValues;
}

如果变量为privateprotected,那么它也应检查getters

5 个答案:

答案 0 :(得分:2)

您可以使用Java反射来分析给定对象的所有字段,并使用它们的值进行打印。有关更多信息,请查看反射文档: http://docs.oracle.com/javase/tutorial/reflect/member/index.html

答案 1 :(得分:1)

尝试使用弹簧ReflectionUtils。 注意:这取决于&#34;价值&#34;有一个正确的字符串表示,它不是递归的(即1级深度)

package com.stackoverflow.so22075052;

import org.springframework.util.ReflectionUtils;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class F {
    public static void main(final String[] args) {
        // fill a list
        final List<Object> objects = new ArrayList<>();
        objects.add(A.of(1));
        objects.add(B.of("2"));

        // introspect
        for (final Object object : objects) {
            ReflectionUtils.doWithFields(object.getClass(), new ReflectionUtils.FieldCallback() {
                @Override
                public void doWith(final Field field) throws IllegalArgumentException, IllegalAccessException {
                    ReflectionUtils.makeAccessible(field);
                    System.out.printf("%s - %s\n", field.getName(),  ReflectionUtils.getField(field, object));
                }
            });
        }
    }

    static class A {
        private int age;

        public static A of(final int age) {
            final A a = new A();
            a.age = age;
            return a;
        }
    }

    static class B {
        private String string;

        public static B of(final String string) {
            final B b = new B();
            b.string = string;
            return b;
        }
    }
}

输出:

age - 1
string - 2

编辑:

BeanUtils#describeMap可能是另一种解决方案

答案 2 :(得分:0)

        List<Object> list = new ArrayList<Object>();

        for (Object object : list) {

            if(object instanceof Person) // Cross check that object contain Person object
            {
                Person person = (Person) object;

                System.out.println("Person age "+person.age());

            }

        }

答案 3 :(得分:0)

每个对象应该负责在打印时表示自己。以下是您如何实现这一目标:

class MyClass {
    int myValue;
    public MyClass(){myValue = 2}; // constructor
    public String toString() {
        return "value " + myValue;
    }
}

每当你想要从这一点开始打印课程时,只需说出

MyClass mc = new MyClass();
System.out.println(mc);

答案 4 :(得分:0)

我前段时间已经创建了一些方法来完成你想要/需要的东西:

public final class MyObjectUtils {

    private static List<Field> getAllFields(Class<?> clazz) {
        if (clazz.equals(Object.class)) {
            return Collections.emptyList();
        }
        List<Field> fields = new ArrayList<Field>();
        fields.addAll(getAllFields(clazz.getSuperclass()));
        fields.addAll(Arrays.asList(clazz.getDeclaredFields()));
        return fields;
    }

    private static List<Field> getModifiableFields(Class<?> clazz) {
        List<Field> fields = getAllFields(clazz);
        List<Field> realFields = new ArrayList<Field>();
        for (Field field : fields) {
            if (!(java.lang.reflect.Modifier.isStatic(field.getModifiers()) || java.lang.reflect.Modifier
                    .isFinal(field.getModifiers()))) {
                realFields.add(field);
            }
        }
        return realFields;
    }

    public static Map<String, Object> getFieldsAndData(Object object) throws IllegalAccessException {
        List<Field> fields = getModifiableFields(object.getClass());
        Map<String, Object> values = new LinkedHashMap<String, Object>();
        for (Field field : fields) {
            if (!field.isAccessible()) {
                field.setAccessible(true);
            }
            values.put(field.getName(), field.get(object));
        }
        return values;
    }
}

这不是一个直接的答案,但你可以根据自己的需要进行调整。