首页 > 解决方案 > 如何打印存储为对象变量的任何类型的数组?

问题描述

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


注意:带有答案的类似问题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]

标签: javareflection

解决方案


  1. 您可以使用Class#isArray来检查该值是否为数组。

  2. 您可以使用java.lang.reflect.Array#getLengthandjava.lang.reflect.Array#get将 an 转换为Object可以Object传递给Arrays.toString.

Demo

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;
}

推荐阅读