Java 数组反射:isArray vs. instanceof
2022-08-31 06:36:01
使用:
if(obj.getClass().isArray()) {}
和
if(obj instanceof Object[]) {}
?
使用:
if(obj.getClass().isArray()) {}
和
if(obj instanceof Object[]) {}
?
在大多数情况下,应使用运算符来测试对象是否为数组。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 级别,运算符转换为特定的“实例”字节代码,该代码在大多数 JVM 实现中都进行了优化。instanceof
在极少数情况下,您可能使用反射来遍历未知类型的对象图。在这种情况下,该方法可能会有所帮助,因为您在编译时不知道组件类型;例如,您可能正在实现某种序列化机制,并且能够将数组的每个组件传递给相同的序列化方法,而不管其类型如何。isArray()
有两种特殊情况:空引用和对基元数组的引用。
空引用将导致结果,而 抛出 .instanceof
false
isArray
NullPointerException
应用于基元数组时,除非右侧操作数上的组件类型与组件类型完全匹配,否则将产生。相反,将返回任何组件类型。instanceof
false
isArray()
true
在后一种情况下,如果 obj 为 null,则不会得到 NullPointerException,而是 false。