如何查看一个对象是否是一个数组而不使用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[]
,所以根据你想要如何处理嵌套数组,它可能变得复杂。
对于toString
, java.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的最好方法是使用一系列
instanceof
expression式。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) == '['; }