如何查看一个对象是否是一个数组而不使用reflection?

如何在Java中看到Object是否是不使用reflection的数组? 我怎样才能不使用reflection迭代所有项目?

我使用谷歌GWT,所以我不允许使用reflection:(

我很乐意实施下列方法而不使用反思:

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

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

你可以使用Class.isArray()

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

这适用于对象和原始types数组。

对于toString来看看Arrays.toString 。 您将不得不检查数组types并调用相应的toString方法。

你可以使用instanceof

JLS 15.20.2types比较运算符instanceof

  RelationalExpression: RelationalExpression instanceof ReferenceType 

在运行时,如果RelationalExpression的值不为null并且可以将引用强制转换为ReferenceType而不引发ClassCastException ,则instanceof运算符的结果为true 。 否则结果是false

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

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

您必须检查对象是否为instanceof boolean[]byte[]short[]char[]int[]long[]float[]double[]Object[]instanceof boolean[] ,if你想检测所有的数组types。

另外, int[][]instanceof Object[]一个instanceof Object[] ,所以根据你想要如何处理嵌套数组,它可能变得复杂。

对于toStringjava.util.Arrays有一个toString(int[])和其他可以使用的重载。 它也有嵌套数组的deepToString(Object[])

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

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

也可以看看

  • 在Java中pipe理高度重复的代码和文档
  • 对于二维数组,Java Arrays.equals()返回false。

可以使用下面的代码分别访问数组中的每个元素:

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

请注意,没有必要知道它是什么types的底层数组,因为这可以用于任何数组。

原始types的数组之间或原始types的数组与引用types的数组之间不存在子types关系。 参见JLS 4.10.3 。

因此,以下是不正确的作为一个testing,看看obj是否是任何types的数组:

 // INCORRECT! public boolean isArray(final Object obj) { return obj instanceof Object[]; } 

具体而言,如果obj是基元的一维数组,则不起作用。 (它对于更高维的原始数组起作用,因为所有的数组types都是Object子types,但在这种情况下是没有意义的)。

我使用谷歌GWT,所以我不允许使用reflection:(

最好的解决scheme(针对问题的isArray数组部分)取决于什么被视为“使用reflection”。

  • 如果调用obj.getClass().isArray()不计算为使用reflection,那么这是最好的解决scheme。

  • 否则,计算一个对象是否具有数组types的最好方法是使用一系列instanceofexpression式。

     public boolean isArray(final Object obj) { return obj instanceof Object[] || obj instanceof boolean[] || obj instanceof byte[] || obj instanceof short[] || obj instanceof char[] || obj instanceof int[] || obj instanceof long[] || obj instanceof float[] || obj instanceof double[]; } 
  • 你也可以尝试使用下面的对象类的名字,但是对obj.getClass()的调用是以reflection为边界的。

     public boolean isArray(final Object obj) { return obj.getClass().toString().charAt(0) == '['; }