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

2 つの可能性があります。

まず、配列ではなくコレクションを含むようにマップを変更します。toString()のメソッドは、 of 要素自体AbstractCollectionを使用してコレクション要素の優れたビューを作成するため、 of 要素が十分に優れている場合は、全体のビューも読みやすくなります。toStringtoString

他の可能性は、マップ エントリを反復処理しArrays.toString(arr)、配列の文字列表現を作成するために使用することです。通常、ロガーは、log4j のフォーマッターを使用するなど、すぐに使用できる柔軟性を備えています。

于 2012-10-11T09:03:04.870 に答える
0

次のように、配列の内容を繰り返して出力する必要があります

 java.util.Arrays.toString(array);
于 2012-10-11T09:01:28.170 に答える
0

これは、Java の闇の部分の 1 つです。

を提供するApache Commons Langのような外部ライブラリを使用できますReflectionToStringBuilder

于 2012-10-11T09:03:40.250 に答える
0

法線マップを拡張して .toString() を覆い隠す独自のマップを定義することもできます。次に、オブジェクトが instanceof 配列であるかどうかをチェックし、別の方法で印刷を処理します。

于 2012-10-11T09:06:29.003 に答える
0

あなたは間違った問題を解決しています。配列のマップの代わりにグアバMultimapを使用すると、文字列表現を含め、すべてがうまく機能します。外部ライブラリを使用したくない場合は、Map<String, List<Object>>. すべての標準的な List 実装は、適切なtoString()メソッドを提供します。

ところで、混合配列は通常、コードの匂いです。配列の内容のオブジェクト表現を作成するようにしてください。

于 2012-10-11T09:49:20.900 に答える
0

値オブジェクトがそのメソッドを適切にオーバーライドしない限り、オブジェクトtoStringを出力するだけでは意味のあるログを出力できません。ただし、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
}

フィールドがプライベート フィールドであり、ゲッター メソッドが使用可能であることが確実な場合は、リフレクションを使用してそれらを呼び出して出力できます。

于 2012-10-11T09:09:33.023 に答える