getClass().isArray()是判断对象是否为原生数组最准确的方式,它通过Class内部标志位识别所有维度和类型的数组,但需先判空且不适用于集合类。

直接调用 obj.getClass().isArray() 是运行时判断对象是否为数组类型最准确、最标准的方式,它不依赖 instanceof(对泛型擦除无效)、不依赖 toString(易被篡改),也不需要反射遍历——只要对象非 null,就能可靠识别原生数组(如 int[]、String[]、MyClass[][] 等所有维度和元素类型的数组)。
为什么 isArray() 比 instanceof 更可靠
instanceof 只能检测是否是某个具体数组类型(如 obj instanceof String[]),但你往往不知道数组的组件类型;而且对基本类型数组(如 int[])无法写通用表达式(obj instanceof [] 语法错误)。而 getClass().isArray() 绕过类型声明,直接检查 Class 对象的内部标志位——JVM 在加载数组类时就设定了 isArray == true,所以它天然支持所有数组,无需预知元素类型或维度。
必须先判空,否则会抛 NullPointerException
getClass() 方法在对象为 null 时会立即抛出异常,因此安全使用必须前置 null 检查:
if (obj == null) return false;return obj.getClass().isArray();
注意:它只识别“原生数组”,不识别 List 或其他集合
getClass().isArray() 返回 true 当且仅当该对象是由 JVM 直接创建的数组实例(即通过 new T[...] 或字面量如 {1,2,3} 创建)。它对 ArrayList、LinkedList、Arrays.asList(...) 返回的包装列表等统统返回 false——这正是它的设计目的:精确区分语言级数组与集合类。若需同时识别“类数组结构”,应额外结合 obj instanceof Collection 或检查是否有 size()/get(int) 等行为,但这已超出 isArray 的职责范围。
小技巧:配合 getComponentType() 获取数组元素类型
一旦确认是数组,可进一步调用 obj.getClass().getComponentType() 得到其元素的 Class:
-
new String[]{"a","b"}.getClass().getComponentType()→String.class -
new int[5].getClass().getComponentType()→int.class -
new Object[0][0].getClass().getComponentType()→Object[].class(说明是二维数组)
这对泛型无关的运行时类型分发、序列化或类型适配非常有用。

















