我要做的是使用几种对象记录复杂的HashMap<String, Object>
,我事先并不知道结构。只有Map's own
toString method is that when it runs in to arrays and their own
toString`方法的问题,输出才能提供信息:
{array=[Ljava.lang.Object;@6c22c95b}
我可以通过哪种方式实现记录Map
的最佳方式?
示例代码段:
public static void main(String[] args) {
final Map<String, Object> map = new HashMap<String, Object>();
final Object[] array = new Object[] {"hep", 1, true};
map.put("array", array);
System.out.println(map);
}
输出:
{array=[Ljava.lang.Object;@6c22c95b}
答案 0 :(得分:2)
你有两种可能性。
首先更改地图以包含集合而不是数组。 toString()
的{{1}}方法使用AbstractCollection
元素本身创建了集合元素的精美视图,因此,如果元素的toString
足够好,则总视图也可以读取
其他可能性是迭代映射条目并使用toString
创建数组的字符串表示形式。通常记录器足够灵活,可以轻松地开箱即用,例如使用log4j的格式化程序。
答案 1 :(得分:0)
你需要迭代并打印数组的内容,如
java.util.Arrays.toString(array);
答案 2 :(得分:0)
这实际上是Java的一个黑暗角落。
您可以使用提供Apache Commons Lang的外部库ReflectionToStringBuilder
。
答案 3 :(得分:0)
那么你可以定义你自己的地图,扩展法线贴图并遮盖.toString() 然后依次检查对象是否为数组的实例,并以不同的方式处理打印。
答案 4 :(得分:0)
除非值Object正确覆盖它的toString
方法,否则只能通过打印Object来打印有意义的日志。但是有可能使用Java反射。使用java.lang.reflect
,您必须获取字段(仅适用于公共字段)及其值。如果字段提到的对象不是覆盖toString
方法,则需要再次使用反射。
Object object = map.get(key);
Class<?> klass = object.getClass(); // but it supports only public fields
Fields[] fields = klaa.getFields();
for (Field field: fields) {
// get the values from the field . Check with the API
}
如果字段是私有字段,并且如果您确定可以使用getter方法,则可以使用反射调用它们并打印它们。
答案 5 :(得分:0)
你正在解决错误的问题。使用Guava Multimap
而不是数组映射,一切都会更好,包括字符串表示。如果您不想使用外部库,请使用Map<String, List<Object>>
。所有标准List实现都提供了正确的toString()
方法。
答案 6 :(得分:0)
这里有一些可能有效的简单实用方法。
public static String toString(Object[] array) {
if (array == null) return "null";
final StringBuilder b = new StringBuilder("[");
for (Object o : array) {
if (b.length() > 0) b.append(", ");
if (o == null) {
b.append("null");
} else if (o instanceof Map) {
b.append(toString((Map) o));
} else if (o.getClass().isArray()) {
b.append(toString((Object[]) o));
} else {
b.append(o.toString());
}
}
return b.append("]").toString();
}
public static String toString(Map map) {
if (map == null) return "null";
final StringBuilder b = new StringBuilder("{");
for (Object key : map.keySet()) {
final Object value = map.get(key);
b.append(key).append("=");
if (value == null) {
b.append("null");
} else {
if (value.getClass().isArray()) {
b.append(toString((Object[]) value, ", "));
} else if (value instanceof Map) {
b.append(toString((Map) value));
} else {
b.append(value);
}
}
}
return b.append("}").toString();
}
这些改编自cobbzilla-utils,我个人的便利实用程序库: