【问题标题】:Iterating over arrays by reflection通过反射迭代数组
【发布时间】:2011-01-13 02:40:43
【问题描述】:

我正在做一些反思工作并解决一个小问题。

我正在尝试将对象打印到某个 GUI 树,但在以通用方式检测数组时遇到问题。

我建议:

可迭代的对象实例

会完成这项工作,但它不会,(显然仅适用于 Lists 和 Set 以及任何实现它的人。)

那么我如何识别数组 Some Object[] ,或 long[]Long[] ..?

谢谢

【问题讨论】:

    标签: java reflection


    【解决方案1】:

    如果你不想只检查对象是否为数组,还想对其进行迭代:

    if (array.getClass().isArray()) {
        int length = Array.getLength(array);
        for (int i = 0; i < length; i ++) {
            Object arrayElement = Array.get(array, i);
            System.out.println(arrayElement);
        }
    }
    

    (上面的类是java.lang.reflect.Array

    【讨论】:

      【解决方案2】:

      首先,@Bozho 的回答是完全正确的。

      如果您想让它更易于使用,我刚刚在 little OSS utility molindo-utils 中创建了一个方法,它将未知类型的数组转换为 Iterable:ArrayUtils.toIterable(Object)

      这样,你可以做到:

      // any array, e.g. int[], Object[], String[], ...
      Object array = ...;
      for (Object element : ArrayUtils.toIterable(array)) {
          // element of type Integer for int[]
          System.out.println(element);
      }
      

      请参阅molindo-utils 的自述文件,了解如何获取 molindo-utils 或随意复制代码,只要您认为合适即可。

      【讨论】:

        【解决方案3】:

        你的意思是Object.getClass().isArray()

        【讨论】:

          【解决方案4】:

          你可以的

          if (o instanceof Object[]) {
            Object[] array = (Object[]) o;
            // now access array.length or 
            // array.getClass().getComponentType()
          }
          

          【讨论】:

          • 这很好,但不适用于原始数组类型。我想我找到了答案:object.getClass().isArray() ..lol
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-12-16
          • 2017-06-02
          • 2021-11-17
          • 2015-09-25
          • 2016-04-10
          • 2021-05-11
          • 2012-04-04
          相关资源
          最近更新 更多