当前位置:  开发笔记 > 编程语言 > 正文

Java数组反射:isArray与instanceof

如何解决《Java数组反射:isArray与instanceof》经验,为你挑选了4个好方法。

使用时是否存在偏好或行为差异:

if(obj.getClass().isArray()) {}

if(obj instanceof Object[]) {}



1> erickson..:

在大多数情况下,您应该使用instanceof运算符来测试对象是否是数组.

通常,在向下转换为编译时已知的特定类型之前测试对象的类型.例如,也许您编写了一些可以使用Integer[]或使用的代码int[].你想用以下方法来保护你的演员阵容instanceof:

if (obj instanceof Integer[]) {
    Integer[] array = (Integer[]) obj;
    /* Use the boxed array */
} else if (obj instanceof int[]) {
    int[] array = (int[]) obj;
    /* Use the primitive array */
} else ...

在JVM级别,instanceof运算符转换为特定的"instanceof"字节代码,该代码在大多数JVM实现中进行了优化.

在极少数情况下,您可能使用反射来遍历未知类型的对象图.在这种情况下,该isArray()方法可能会有所帮助,因为您在编译时不知道组件类型; 例如,您可能正在实现某种序列化机制,并且无论类型如何,都能够将数组的每个组件传递给相同的序列化方法.

有两种特殊情况:空引用和对原始数组的引用.

空引用将导致instanceof结果false,而isArray抛出a NullPointerException.

施加到一个原始阵列,所述instanceof产量false除非在右边的操作数的组件类型完全分量类型相匹配.相反,isArray()将返回true任何组件类型.


是的,但它会有多大的不同?这听起来像是对我的微观优化.
`instanceof`不适用于整数类型的数组.
-1:通常,因为原始数组*是*数组,所以应该使用`isArray()`.在只有对象数组的非常规*特殊情况下,`instanceof`提供了一种高性能的替代方案.
对不起我的意思是`obj instanceof Object []`如果`Object obj = new int [7]`会产生`false`.
@Dims如果你断言`obj instanceof int []`在你将`int []`赋给`obj`时会产生`false`,你就错了.
是的,在Java中,原始数据类型不是对象,并且不扩展`java.lang.Object`,所以这是有道理的.但是`instanceof`仍然可以用来测试原始数组.

2> Burkhard..:

在后一种情况下,如果obj为null,则不会出现NullPointerException而是false.



3> Tom Hawtin -..:

如果obj是类型int[]说,那么将有一个数组Class但不是一个实例Object[].那你想做什么obj.如果你要施展它,那就去吧instanceof.如果您打算使用反射,请使用.getClass().isArray().



4> dturanski..:

我最近遇到了将Groovy应用程序从JDK 5升级到JDK 6的问题.isArray()在JDK6中使用失败:

MissingMethodException:
No signature of sun.reflect.generics.reflectiveObjects.GenericArrayTypeImpl.isArray() ...

改为instanceof Object[]固定这个.

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有