首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java数组反射: isArray与instanceof

Java数组反射: isArray与instanceof
EN

Stack Overflow用户
提问于 2008-10-20 20:56:37
回答 8查看 140K关注 0票数 186

在使用以下命令时是否存在偏好或行为差异:

代码语言:javascript
复制
if(obj.getClass().isArray()) {}

代码语言:javascript
复制
if(obj instanceof Object[]) {}
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2008-10-20 21:24:02

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

通常,在将对象类型向下转换为编译时已知的特定类型之前,需要测试对象的类型。例如,也许您编写了一些可以与Integer[]int[]一起使用的代码。您可能希望使用instanceof保护您的强制转换

代码语言:javascript
复制
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抛出NullPointerException

应用于基元数组时,除非右操作数上的组件类型与组件类型完全匹配,否则instanceof将生成false。相反,对于任何组件类型,isArray()都将返回true

票数 209
EN

Stack Overflow用户

发布于 2008-10-20 20:59:46

在后一种情况下,如果obj为null,则不会得到NullPointerException,而是false。

票数 34
EN

Stack Overflow用户

发布于 2008-10-21 12:16:06

如果objint[]类型,那么它将有一个数组Class,但不是Object[]的实例。那么你想用obj做什么呢?如果要对其进行造型,请使用instanceof。如果你打算使用反射,那么就使用.getClass().isArray()

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/219881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档