如何使用ToStringBuilder.reflectionToString获取ArrayList的内容
如何用reflectionToString获取ArrayList的元素内容?
你遇到的这个情况很常见,问题出在ArrayList存储元素的核心字段elementData上——它被transient关键字修饰了,而ToStringBuilder.reflectionToString默认会跳过transient修饰的字段,所以你只能看到对象地址和size字段,看不到实际元素。
下面给你两种可行的解决方案:
方案1:配置ReflectionToStringBuilder包含transient字段
直接使用ReflectionToStringBuilder的重载方法,手动设置允许输出transient字段,同时开启递归输出内部元素:
import org.apache.commons.lang3.builder.ReflectionToStringBuilder; import org.apache.commons.lang3.builder.RecursiveToStringStyle; import java.util.ArrayList; public class Test { public static void main(String[] args) { ArrayList<String> nodeList = new ArrayList<>(); nodeList.add("Inpt1"); nodeList.add("Inpt2"); String result = ReflectionToStringBuilder.toString( nodeList, new RecursiveToStringStyle() { { setUseTransient(true); // 允许输出transient修饰的字段 } }, true, // 输出所有访问权限的字段(包括非public) true // 递归解析内部对象的字段 ); System.out.println(result); } }
运行后你会得到类似这样的输出,能看到elementData数组里的具体元素:
java.util.ArrayList@5ca881b5[
elementData={Inpt1, Inpt2, null, null, null, null, null, null, null, null},
size=2
]
方案2:结合ArrayList自身的toString方法(简化版)
如果你只是想快速看到元素内容,其实ArrayList已经重写了toString()方法,直接调用就能输出元素,不需要用反射:
System.out.println(nodeList.toString());
输出会是:[Inpt1, Inpt2]
不过如果你的场景必须用反射ToString的方式,方案1就是最优解啦。
内容的提问来源于stack exchange,提问作者ravi k
相关产品推荐
相关产品推荐

