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

时间:2010-04-27 22:10:59

标签: java arrays gwt instanceof

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

我使用Google GWT,所以我不允许使用反射:(

我希望在不使用反思的情况下实现以下方法:

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

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

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

6 个答案:

答案 0 :(得分:223)

您可以使用Class.isArray()

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

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

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

答案 1 :(得分:64)

您可以使用instanceof

JLS 15.20.2 Type Comparison Operator instanceof

 RelationalExpression:
    RelationalExpression instanceof ReferenceType
     

在运行时,如果 RelationalExpression 的值不是instanceof并且引用可以转换为true,则null运算符的结果为ClassCastException ReferenceType 而不会引发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[]int[][]

此外,instanceof Object[]toString,因此根据您希望如何处理嵌套数组,它可能会变得复杂。

对于toString(int[])java.util.ArraysdeepToString(Object[])以及您可以使用的其他重载。嵌套数组也有public String toString(Object arr) { if (arr instanceof int[]) { return Arrays.toString((int[]) arr); } else //... }

{{1}}

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

另见

答案 2 :(得分:30)

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

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

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

答案 3 :(得分:9)

基本类型的数组之间或基本类型的数组与引用类型的数组之间没有子类型关系。请参阅JLS 4.10.3

因此,以下内容不正确,以确定obj是否为任何类型的数组

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

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

  

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

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

1 - 更准确地说,this page中的Class.isArray方法被GWT列为支持。

答案 4 :(得分:0)

您可以创建一个实用程序类,以检查该类是否表示任何 Collection Map Array

  public static boolean isCollection(Class<?> rawPropertyType) {
        return Collection.class.isAssignableFrom(rawPropertyType) || 
               Map.class.isAssignableFrom(rawPropertyType) || 
               rawPropertyType.isArray();
 }

答案 5 :(得分:0)

obj instanceof Object[](在JShell上测试)。