微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 JDK11 中使用 ToStringBuilder.reflectionToString() 将对象转换为字符串

如何解决在 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 以外的其他类),您仍然可以通过反射访问它并将其转换回 Stringchar[]

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 举报,一经查实,本站将立刻删除。