如何解决在 JDK11 中使用 ToStringBuilder.reflectionToString() 将对象转换为字符串
我正在尝试使用 ToStringBuilder.reflection 将对象转换为字符串。
public static void main(String[] args) {
Object obj = "Hello";
System.out.print(ToStringBuilder.reflectionToString(obj));
}
JDK 8 中的输出是:
java.lang.String@7ea987ac[value={H,e,l,o},hash=69609650]
JDK 11 中的输出是:
java.lang.String@18ef96[value={72,101,108,111},coder=0,hash=69609650]
我知道在 JDK 11 中它打印字节数组,因为 JDK 11 将 String 类中的“值”字段定义为字节数组(private final byte[] value;)与 char[] 相比JDK 8. 有没有像上面 JDK 8 中的输出一样在 JDK 11 中将 String 值打印为字符数组?
解决方法
默认情况下应该足以让 java.lang.String
调用 toString()
以独立于使用的 JRE/JDK 版本获取字符串值。
如果需要字符值,或者将 toCharArray()
与 Arrays.toString
结合使用:
String str = "test123äöüß@€";
System.out.println(Arrays.toString(str.toCharArray()));
// Output: [t,e,s,t,1,2,3,ä,ö,ü,ß,@,€]
如果您更喜欢反射(例如对于 java.lang.String
以外的其他类),您仍然可以通过反射访问它并将其转换回 String
和 char[]
:
String str = "test123äöüß@€";
Field valueField = String.class.getDeclaredField("value");
valueField.setAccessible(true);
byte[] bytearr = (byte[]) valueField.get(str);
// Get the used charset (since Java 9 this does not have to be UTF-16)
Field coderField = String.class.getDeclaredField("coder");
coderField.setAccessible(true);
byte coder = coderField.getByte(str);
Charset charset = coder == 0 ? StandardCharsets.ISO_8859_1 : StandardCharsets.UTF_16LE;
String s = new String(bytearr,charset);
System.out.println(Arrays.toString(s.toCharArray()));
此代码在具有 64 位 x86 CPU 的台式机上进行了测试。在默认使用大端的 CPU 上,它可能是 StandardCharsets.UTF_16BE
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。