2017-01-23 6 views
1

私はこのポストで答えられる同じ問題を持っています How do I print my Java object without getting "[email protected]"? 私はオブジェクト参照値を出力しているログにPutObjectRequestを印刷しようとしています。しかし、私はAWSからあらかじめ定義されたクラス(PutObjectRequest)を使用しているので、toString()メソッドを追加することはできません。そのオブジェクトにどのような値が入るのか印刷する方法はありますか?定義済みのJavaオブジェクトを印刷するには?

log.info("Sending request: {}", request); 
+1

本当にありません。そのクラスの作成者が適切な 'toString()'メソッドを含む先見の明を持たない場合、あなたは一種の骨抜きです。リスト内の各オブジェクトタイプを検索して、適切なかなりのプリンタ(書く必要があります)を選択することができますが、これは実装にかなり時間がかかることです。 – markspace

+0

タイプはJSONのようなフォーマットに簡単にシリアライズできます。これが当てはまる場合、テキスト(有益かそうでないか)は比較的簡単に抽出できるかもしれません。YMMVとオブジェクトグラフに依存する他の潜在的な問題があります。 JSONシリアライゼーション自体は反射を使用しますが、手動で行う/できます。 – user2864740

+0

それとも、私が思うように反射でそれを突くことができます。また面倒ですが、 'toString()'を使わずにシステム内のすべてのオブジェクトを印刷するという妥当な仕事をするメソッドを書くことができるかもしれません。 – markspace

答えて

2

そのオブジェクトに行くどの値に印刷する方法はありますか?

あなたは、(公共のゲッターを使用して)要求オブジェクトの関連する成分を抽出、それらを適切にフォーマットし、文字列として多くのことを返すために、独自のメソッドを記述する必要があります。その後、requestオブジェクトでそのメソッドを呼び出し、結果の文字列をrequestオブジェクトではなくロガーに渡します。

抽象的なスマッシュリフレクションを使用してプライベート状態を調べる必要がある場合、それは難しく、要求クラスの実装の詳細が変更されるとコードが破損する危険性があります。

退屈です。しかし、一般的な解決法、AFAIKはありません。

(あなたは、一般的な直列化スキームを使用している場合、あなたは...コンポーネントのいくつかがどちらかは関係ありません、またはも、シリアライズ、または巨大な問題に対して実行しやすい)


UPDATE - 実際には、このようなあなたのカスタムメソッドを使用することをお勧めし:

if (log.isInfoEnabled()) { 
    log.info("Sending request: {}", myFormat(request)); 
} 

あなたがinfo(...)コールを守るていない場合は、フォーマットのオーバーヘッドは関係なくlogginレベルの計上されます。

関連する問題