Dav*_*ron 173 java arrays reflection
使用时是否存在偏好或行为差异:
if(obj.getClass().isArray()) {}
和
if(obj instanceof Object[]) {}
?
eri*_*son 200
在大多数情况下,您应该使用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任何组件类型.
如果obj是类型int[]说,那么将有一个数组Class但不是一个实例Object[].那你想做什么obj.如果你要施展它,那就去吧instanceof.如果您打算使用反射,请使用.getClass().isArray().
我最近遇到了将Groovy应用程序从JDK 5升级到JDK 6的问题.isArray()在JDK6中使用失败:
MissingMethodException:
No signature of sun.reflect.generics.reflectiveObjects.GenericArrayTypeImpl.isArray() ...
改为instanceof Object[]固定这个.
| 归档时间: | 
 | 
| 查看次数: | 124088 次 | 
| 最近记录: |