如何在不使用反射的情况下查看对象是否是数组?

2022-08-31 09:31:39

如何在Java中查看对象是否是数组而不使用反射?如何在不使用反射的情况下遍历所有项目?

我使用Google GWT,因此不允许使用反射:(

我很想在不使用refelection的情况下实现以下方法:

private boolean isArray(final Object obj) {
  //??..
}

private String toString(final Object arrayObject) {
  //??..
}

顺便说一句:我也不想使用JavaScript,这样我就可以在非GWT环境中使用它。


答案 1

您可以使用Class.isArray()

public static boolean isArray(Object obj)
{
    return obj!=null && obj.getClass().isArray();
}

这适用于对象和基元类型数组。

有关 toString,请查看 .您必须检查数组类型并调用相应的方法。Arrays.toStringtoString


答案 2

您可以使用 .instanceof

JLS 15.20.2 类型比较运算符实例

 RelationalExpression:
    RelationalExpression instanceof ReferenceType

在运行时,运算符的结果是关系表达式的值不是,并且引用可以强制转换为 ReferenceType 而不引发 .否则,结果为 。instanceoftruenullClassCastExceptionfalse

这意味着你可以做这样的事情:

Object o = new int[] { 1,2 };
System.out.println(o instanceof int[]); // prints "true"        

如果要检测所有数组类型,则必须检查对象是否为 、 、 、 或 。instanceof boolean[]byte[]short[]char[]int[]long[]float[]double[]Object[]

此外,an 是 一个 ,因此根据您想如何处理嵌套数组,它可能会变得复杂。int[][]instanceof Object[]

对于 ,java.util.Arrays 具有您可以使用的重载和其他重载。它还具有嵌套数组。toStringtoString(int[])deepToString(Object[])

public String toString(Object arr) {
   if (arr instanceof int[]) {
      return Arrays.toString((int[]) arr);
   } else //...
}

这将是非常重复的(但即使是java.util.Arrays也非常重复),但这就是Java中数组的方式。

另请参见