我想获取类实例的所有属性的名称和值。该类可以是任何定制的任何类,它也可以具有对象列表,散列映射,表等,并且可以从另一个类中扩展。实际上我的意思是我想得到一个班级的所有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());
}
}
}
答案 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()))
除此之外,还有更多标准化的方法可以做你想做的事情,我在之前的答案中已经展示过。你可以: