如何在不使用反射的情况下查看对象是否是数组?
在Java中如何在不使用反射的情况下查看对象是否是数组? 如何在不使用反射的情况下迭代所有项目?
我使用 Google GWT,所以不允许使用反射:(
我很想在不使用反射的情况下实现以下方法:
private boolean isArray(final Object obj) {
//??..
}
private String toString(final Object arrayObject) {
//??..
}
顺便说一句:我也不想使用 JavaScript,这样我就可以在非 GWT 环境中使用它。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
您可以使用 Class.isArray()
这适用于对象和基本类型数组。
对于toString,请查看Arrays.toString。您必须检查数组类型并调用适当的 toString 方法。
You can use
Class.isArray()
This works for both object and primitive type arrays.
For toString take a look at
Arrays.toString
. You'll have to check the array type and call the appropriatetoString
method.您可以使用
instanceof
。JLS 15.20.2 类型比较运算符
instanceof
这意味着您可以执行以下操作:
您必须检查对象是否是
instanceof boolean[]
、byte[]
、short[]< /code>、
char[]
、int[]
、long[]
、float[]
、>double[]
或Object[]
,如果您想检测所有数组类型。此外,
int[][]
是一个Object[]
实例,因此根据您想要如何处理嵌套数组,它可能会变得复杂。对于
toString
,java.util.Arrays
有一个toString(int[])
和其他可以使用的重载。它还具有用于嵌套数组的deepToString(Object[])
。它会非常重复(但即使
java.util.Arrays
非常重复),但这就是 Java 中数组的方式。另请参阅
You can use
instanceof
.JLS 15.20.2 Type Comparison Operator
instanceof
That means you can do something like this:
You'd have to check if the object is an
instanceof boolean[]
,byte[]
,short[]
,char[]
,int[]
,long[]
,float[]
,double[]
, orObject[]
, if you want to detect all array types.Also, an
int[][]
is aninstanceof Object[]
, so depending on how you want to handle nested arrays, it can get complicated.For the
toString
,java.util.Arrays
has atoString(int[])
and other overloads you can use. It also hasdeepToString(Object[])
for nested arrays.It's going to be very repetitive (but even
java.util.Arrays
is very repetitive), but that's the way it is in Java with arrays.See also
可以使用以下代码单独访问数组的每个元素:
请注意,无需知道它是什么类型的底层数组,因为这适用于任何数组。
One can access each element of an array separately using the following code:
Notice that it is unnecessary to know what kind of underlying array it is, as this will work for any array.
基本类型数组之间或基本类型数组与引用类型数组之间不存在子类型关系。请参见 JLS 4.10.3。
因此,以下测试
obj
是否是任何类型的数组的测试是不正确的:具体来说,如果
obj
则不起作用:是基元的一维数组。 (它确实适用于具有更高维度的原始数组,因为所有数组类型都是Object
的子类型。但在这种情况下它没有实际意义。)最佳解决方案(问题的
isArray
数组部分)取决于什么算作“使用反射”。在 GWT 中,调用
obj.getClass().isArray()
不算使用反射1,因此这是最好的解决方案。否则,这是确定对象是否具有反射的最佳方法 。数组类型是使用一系列
instanceof
表达式。您还可以尝试如下修改对象类的名称,但对
obj.getClass()
的调用接近于反射。1 - 更准确地说,Class.isArray 方法rel="nofollow noreferrer">此页面。
There is no subtyping relationship between arrays of primitive type, or between an array of a primitive type and array of a reference type. See JLS 4.10.3.
Therefore, the following is incorrect as a test to see if
obj
is an array of any kind:Specifically, it doesn't work if
obj
is 1-D array of primitives. (It does work for primitive arrays with higher dimensions though, because all array types are subtypes ofObject
. But it is moot in this case.)The best solution (to the
isArray
array part of the question) depends on what counts as "using reflection".In GWT, calling
obj.getClass().isArray()
does not count as using reflection1, so that is the best solution.Otherwise, the best way of figuring out whether an object has an array type is to use a sequence of
instanceof
expressions.You could also try messing around with the name of the object's class as follows, but the call to
obj.getClass()
is bordering on reflection.1 - More precisely, the
Class.isArray
method is listed as supported by GWT in this page.您可以创建一个实用程序类来检查该类是否表示任何 Collection、Map 或 Array
You can create a utility class to check if the class represents any Collection, Map or Array
只需
obj instanceof Object[]
(在 JShell 上测试)。Simply
obj instanceof Object[]
(tested on JShell).