有没有办法可以打印Object
Object
可以属于任何级别的所有名称和值?
即如果Object
为Person
且Person
有成员变量Integer age;
- 我需要方法可以接收Object
的实例(在这种情况下Object
为Person
但可以是任何其他类型的对象)并打印age - 35
age
}是成员变量name
,35
是value
。
类似的东西:
public Map<String, String> getNamesAndValues(Object object) {
Map<String, String> namesAndValues = new HashMap<>();
//Populate namesAndValues Map here using object in signature.
return namesAndValues;
}
如果变量为private
或protected
,那么它也应检查getters
。
答案 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#describe和Map
可能是另一种解决方案
答案 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;
}
}
这不是一个直接的答案,但你可以根据自己的需要进行调整。