java - 如何打印存储为对象变量的任何类型的数组?
问题描述
下面的代码将数组打印为一个神秘的字符串
注意:带有答案的类似问题Arrays.toString(arr)
无济于事,因为在我的情况下,传递给arr
参数的变量类型将是Object
并且Arrays.toString(Object arr)
方法不存在。
我尝试使用一些东西,Arrays.toString((?[])v)
因为在编译时我不知道数组的确切类型,但这不是有效的 Java 语法。
import java.io.*;
import java.lang.reflect.*;
import java.util.ArrayList;
public class Play {
public ArrayList<Integer> list = new ArrayList<>();
public int[] iarray = {1, 2, 3};
public boolean[] barray = {true, false};
public static void main(String[] args) throws IOException, IllegalAccessException {
Play o = new Play();
// Is it possible to initialize it in constructor as {1, 2}?
o.list.add(1);
o.list.add(2);
Field[] fields = o.getClass().getDeclaredFields();
for (Field field : fields) {
Object v = field.get(o);
// Object s = v.getClass().getName().startsWith("[") ? Arrays.toString((?[])v) : v;
System.out.println(v);
}
}
}
输出
[1, 2]
[I@3498ed
[Z@1a407d53
有没有一种方法可以在没有switch/case
每个 int/bool/double/string 类型的情况下打印下面的结果?
[1, 2]
[1, 2, 3]
[true, false]
解决方案
您可以使用
Class#isArray
来检查该值是否为数组。您可以使用
java.lang.reflect.Array#getLength
andjava.lang.reflect.Array#get
将 an 转换为Object
可以Object
传递给Arrays.toString
.
public static void main(String[] args) throws IOException, IllegalAccessException {
Play o = new Play();
o.list.add(1);
o.list.add(2);
Field[] fields = o.getClass().getDeclaredFields();
for (Field field: fields) {
Object v = field.get(o);
if (v.getClass().isArray()) System.out.println(Arrays.toString(toArray(v)));
else System.out.println(v);
}
}
private static Object[] toArray(Object obj) {
int len = Array.getLength(obj);
Object[] res = new Object[len];
for (int i = 0; i < len; i++) res[i] = Array.get(obj, i);
return res;
}
推荐阅读
- android - 如何在 CameraX 的实时 PreviewView 上应用颜色过滤器?
- c# - 中间件未正确处理 403,但正在正确处理 404
- react-native - React Native - Redux combineReducers 不工作
- python-3.x - 在 AWS Glue 中使用 Python shell 合并多个文件时,标题重复
- java - 如何修复 java.lang.ArrayIndexOutOfBoundsException: length=0; 指数=-1
- javascript - 下划线车把中的空白行区域
- javascript - javascript 函数在 Chrome 和 Firefox 中返回不同的结果
- c# - 错误:在进行并发提交时,所需的防伪表单字段“__RequestVerificationToken”不存在
- kubernetes-ingress - nginx-ingress-controller 不考虑 EKS 中的上游服务
- matlab - 鱼眼外在 vs 估计WorldCameraPose