2017-07-29 102 views
0

我正在尝试编写一个包装方法来为我的日志消息添加方法名称和用户ID。我使用的String.format撰写消息结构,但问题带有通过的String.format()String.format打印地址,而不是可变长度字符串

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); 
} 

调用上述方法作为

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

上述呼叫打印

可变参数的解释
someMethod:: User:1266 : Some text here: [Ljava.lang.Object;@705a8dbc 

为什么String.format字符串的“打印地址”是“test”?

+1

在这里:*** @ 705a8dbc ***是散列码,而不是地址...对象必须覆盖toString方法... –

+0

哦,是的,谢谢你纠正,但“测试”是一个字符串 – learningtocode

+0

做我们将其作为https://stackoverflow.com/questions/409784/whats-the-simplest-way-to-print-a-java-array的副本来关闭它? – 2017-07-29 18:25:28

回答

0

argument对象实际上是一个对象数组。而当你调用这种对象的toString()方法,你通常得到的东西就像你:

[Ljava.lang.Object;@705a8dbc 

事实上,[Ljava.lang.Object是一个Java字节码类型说明符,意思是“这是一个数组(“[ ')java.lang.Object继承类型(‘Ljava.lang.Object’)

705a8dbc 

这是数组的hashCode十六进制值。如果你看看这个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不扩大的参数。我工作围绕这一问题通过传递方法的名称和用户ID信息像这样经过:

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

和修改方法如下:

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

还不如PPL一个理想的解决方案可能无法在方法名传递和用户ID作为方法期望,但会在方法上添加一些注释以防止混淆。