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

edb*_*ras 91 java arrays gwt instanceof

如果Object是不使用反射的数组,我如何在Java中看到?如何在不使用反射的情况下迭代所有项目?

我使用谷歌GWT所以我不允许使用反射:(

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

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

private String toString(final Object arrayObject) {
  //??..
}
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*Kuo 235

您可以使用 Class.isArray()

public static boolean isArray(Object obj)
{
    return obj!=null && obj.getClass().isArray();
}
Run Code Online (Sandbox Code Playgroud)

这适用于对象和基本类型数组.

对于toString来看看Arrays.toString.您必须检查数组类型并调用适当的toString方法.

  • 值得补充的是,您可以通过使用 `obj.getClass().getComponentType()` 来找出数组类型。 (3认同)

pol*_*nts 65

你可以用instanceof.

JLS 15.20.2类型比较运算符 instanceof

 RelationalExpression:
    RelationalExpression instanceof ReferenceType
Run Code Online (Sandbox Code Playgroud)

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

这意味着你可以这样做:

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

你不得不检查对象是instanceof boolean[],byte[],short[],char[],int[],long[],float[],double[],或者Object[],如果你想检测所有数组类型.

另外,a int[][]是一个instanceof Object[],所以根据你想要处理嵌套数组的方式,它会变得复杂.

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

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

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

也可以看看

  • 顺便说一句:我还注意到另一个很好的方法来发现是否有一个数组Class.isArray()(在Arrays.deepToString()中使用). (2认同)

use*_*596 32

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

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

请注意,没有必要知道它是什么类型的底层数组,因为这适用于任何数组.

  • 这个答案很棒,因为它向我们展示了如何在不知道其内容类型的情况下获取数组的大小并检索元素.我敢肯定,大多数人以前从未编写过这样的代码. (13认同)
  • `isArray()`在此之前4年发布的答案中已经充分涵盖了. (2认同)

Ste*_*n C 9

原始类型的数组之间或基本类型的数组与引用类型的数组之间不存在子类型关系.见JLS 4.10.3.

因此,以下是不正确的测试,看看是否obj任何类型的数组:

// INCORRECT!
public boolean isArray(final Object obj) {
    return obj instanceof Object[];
}
Run Code Online (Sandbox Code Playgroud)

具体来说,如果obj是1-D基元数组则不起作用.(它确实适用于具有更高维度的原始数组,因为所有数组类型都是子类型Object.但在这种情况下它没有实际意义.)

我使用谷歌GWT所以我不允许使用反射:(

最好的解决方案(isArray问题的数组部分)取决于什么算作"使用反射".

  • 在GWT中,调用obj.getClass().isArray()不算作使用反射1,因此这是最佳解决方案.

  • 否则,确定对象是否具有数组类型的最佳方法是使用一系列instanceof表达式.

    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[];
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 您还可以尝试使用对象类的名称,如下所示,但调用obj.getClass()接近反射.

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

1 - 更确切地说,该Class.isArray方法在本页中列为GWT支持的方法.