2

我正在尝试做的是记录一个HashMap<String, Object>包含多种对象的复合体,但我事先并不知道结构。Map's owntoString toString`方法的唯一问题method is that when it runs in to arrays and their own是输出信息不足:

{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}
4

7 回答 7

2

你有两种可能性。

首先将您的地图更改为包含集合而不是数组。toString()方法使用of 元素本身AbstractCollection创建集合元素的漂亮视图,因此如果您的元素足够好,则整个视图也将是可读的。toStringtoString

其他可能性是遍历映射条目并用于Arrays.toString(arr)创建数组的字符串表示。通常记录器足够灵活,可以很容易地做到这一点,例如使用 log4j 的格式化程序。

于 2012-10-11T09:03:04.870 回答
0

好吧,您可以定义自己的贴图来扩展法线贴图并遮盖 .toString() 然后依次检查对象是否为 instanceof 数组并以不同方式处理打印。

于 2012-10-11T09:06:29.003 回答
0

这确实是 Java 的黑暗角落之一。

您可以使用Apache Commons Lang 之类的外部库,它提供ReflectionToStringBuilder.

于 2012-10-11T09:03:40.250 回答
0

你正在解决错误的问题。使用番石榴Multimap代替数组映射,一切都会更好,包括字符串表示。如果您不想使用外部库,请使用Map<String, List<Object>>. 所有标准 List 实现都提供了适当的toString()方法。

顺便说一句,混合数组通常是代码异味。您应该尝试创建数组内容的对象表示。

于 2012-10-11T09:49:20.900 回答
0

您需要迭代并打印数组的内容,例如

 java.util.Arrays.toString(array);
于 2012-10-11T09:01:28.170 回答
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 方法可用,那么您可以使用反射调用它们并打印它们。

于 2012-10-11T09:09:33.023 回答
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,我的个人方便实用程序库:

于 2017-08-16T03:12:19.670 回答