如何打印存储为对象变量的任何类型的数组?



下面的代码将数组打印为一个神秘的字符串


注意:Arrays.toString(arr)答案类似的问题没有帮助,因为在我的情况下,传递给arr参数的变量类型将是ObjectArrays.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]
  1. 您可以使用Class#isArray来检查值是否为数组

  2. 您可以使用java.lang.reflect.Array#getLengthjava.lang.reflect.Array#getObject转换为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;
}

如果您可以使用原始包装器类IntegerBoolean来声明数组,您可以这样做。我还添加了一个直接填充列表的构造函数。

public class Play {
public ArrayList<Integer> list = new ArrayList<>();
public Integer[] iarray            = {1, 2, 3};
public Boolean[] barray        = {true, false};
public Play(Integer... vals) {
list.addAll(Arrays.asList(vals));
}
public static void main(String[] args) throws IOException, IllegalAccessException {
Play o = new Play(1, 2);
Field[] fields = o.getClass().getDeclaredFields();
for (Field field : fields) {
Object v = field.get(o);
if(v.getClass().isArray() && !v.getClass().getComponentType().isPrimitive())
System.out.println(Arrays.toString((Object[])v));
else
System.out.println(v);
}
}
}

输出:

[1, 2]
[1, 2, 3]
[true, false]

你想做的大部分事情都是由Arrays.deepToString()完成的。

试试这个。

public class Play {
public List<Integer> list = List.of(0, 1);
public int ivalue = 999;
public int[] iarray = {1, 2, 3};
public int[][] iarray2 = {{1}, {2, 3}};
public boolean[] barray = {true, false};
public String[] sarray = {"A", "B"};
public String[][] sarray2 = {{"A", "B"}, {"C"}};
static String toString(Object obj) {
String s = Arrays.deepToString(new Object[] {obj});
return s.substring(1, s.length() - 1);
}
public static void main(String[] args) throws IllegalAccessException {
Play o = new Play();
for (Field field : o.getClass().getDeclaredFields())
System.out.println(field.getName() + " = " + toString(field.get(o)));
}
}
输出:

list = [0, 1]
ivalue = 999
iarray = [1, 2, 3]
iarray2 = [[1], [2, 3]]
barray = [true, false]
sarray = [A, B]
sarray2 = [[A, B], [C]]

相关内容

最新更新