2017-07-29 5 views
0

ログメッセージにメソッド名とユーザIDを接頭辞として付加するラッパーメソッドを記述しようとしています。String.format varargsの文字列ではなくアドレスを出力する

logMessage(methodName, userId, "Some text here: %s", 
       "test")); 

上記コール印刷物として上記のメソッドを呼び出す)

private String logMessage(@NonNull String methodName, @NonNull String userId, @NonNull String message, Object... arguments) { 
    //String temp = String.format(message, arguments); 
    //String msg = String.format("%s:: User:%s : %s", methodName, userId, temp);<--This works 
    String msg = String.format("%s:: User:%s : " + message, methodName, userId, arguments);<--This prints address of arguments object 
    log.info(msg); 
} 

を私はメッセージ構造を構成するString.Formatのを使用していますが、問題は、String.Formatの(で可変引数の解釈が付属しています

someMethod:: User:1266 : Some text here: [Ljava.lang.Object;@705a8dbc 

なぜString.formatは文字列 "test"のアドレスを出力しますか?

+1

ここでは*** @ 705a8dbc ***はハッシュコードであり、アドレスではありません...オブジェクトはtoStringメソッドをオーバーライドする必要があります... –

+0

ああ、訂正していただきありがとうございますが、 "test"は文字列です – learningtocode

+0

Doこれをhttps://stackoverflow.com/questions/409784/whats-the-simplest-way-to-print-a-java-arrayの複製として閉じますか? –

答えて

0

argumentオブジェクトは実際にはオブジェクトの配列です。あなたは、オブジェクトのこの種に対してtoString()メソッドを呼び出すときに得たようにそして、あなたは通常、何かを得る:

実際に
[Ljava.lang.Object;@705a8dbc 

は、[Ljava.lang.Objectは意味Javaバイトコードの型記述子である「これは配列です(「[ ')のjava.lang.Objectタイプの( 『Ljava.lang.Object』)

705a8dbc 

これは、配列のハッシュコード進値である。あなたはこのSO questionを見れば、あなたは受け入れで、それを見ることができますhashCode()メソッドは一意の識別子を返す必要があり、一般的にオブジェクトの内部アドレスを変換することで実装されています整数に、あなたが、配列内の各オブジェクトののtoString()値を取得したい場合は、あなたが使用する必要があります

を必要とされていません。

Arrays.toString(argument); 

この静的メソッドは文字列をretunsすべてこのように角括弧の間に、カンマで区切られた各オブジェクトのtoString値:私はこの問題を参照

[null, null, null, null, null] // Example with System.out.println(Arrays.toString(new Object[5])); 
0

は、可変引数は、実際にはアレイであり、String.Formatの引数を拡張されていません。

logMessageWithPrefix("Some text here: %s", 
       methodName, userId, "test") 

とのような方法を変更する:私はこのようなメッセージの後にメソッド名とユーザーIDを渡すことで問題を回避働いた皆さんのように理想的なソリューションは、methodNameのを渡していない可能性がある

private String logMessageWithPrefix(@NonNull String message, Object... arguments) { 
    String msg = String.format("%s:: Profile:%s : " + message, arguments); 
    return msg; 
} 

ないとメソッドが予期しているようにuseridを使用しますが、混乱を避けるためにメソッドにいくつかの注意を追加します。

関連する問題