回答:
ほとんどの場合、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()
、コンパイル時にコンポーネントの種類がわからないため、この方法が役立ちます。たとえば、ある種のシリアル化メカニズムを実装していて、タイプに関係なく、配列の各コンポーネントを同じシリアル化メソッドに渡すことができる場合があります。
2つの特殊なケースがあります。null参照とプリミティブ配列への参照です。
null参照はinstanceof
結果を引き起こしfalse
、がをisArray
スローしNullPointerException
ます。
プリミティブ配列に適用すると、右側のオペランドのコンポーネントタイプがコンポーネントタイプと正確に一致しない限り、instanceof
yields false
が発生します。対照的に、isArray()
はtrue
すべてのコンポーネントタイプに対して返されます。
obj instanceof int[]
利回りはfalse
あなたが割り当てるときint[]
にobj
、あなたは間違っています。
obj instanceof Object[]
収量をfalse
場合Object obj = new int[7]
。
java.lang.Object
ので、それは理にかなっています。ただしinstanceof
、プリミティブ配列のテストには引き続き使用できます。
isArray()
を使用する必要があります。オブジェクトの配列のみを持つ非常に一般的ではない特殊なケースでinstanceof
は、高性能の代替手段を提供します。
obj
がint[]
言うタイプの場合、その配列には配列Class
がありますが、のインスタンスにはなりませんObject[]
。何だからあなたがやりたいですobj
。キャストする場合は、を使用してくださいinstanceof
。リフレクションを使用する場合は、を使用します.getClass().isArray()
。
getClass().isArray()
Sun Java 5または6 JREでは、IBMよりも大幅に遅くなります。
そのため、clazz.getName().charAt(0) == '['
Sun JVMの方が高速です。
最近、GroovyアプリケーションをJDK 5からJDK 6にアップグレードする際に問題isArray()
が発生しました。JDK6での使用が失敗しました:
MissingMethodException:
No signature of sun.reflect.generics.reflectiveObjects.GenericArrayTypeImpl.isArray() ...
instanceof Object[]
これを修正しました。
isArray
はのメソッドでありClass
、ではないType
ので、もちろんGenericArrayTypeImpl
そのメソッドはありません。そして、getClass
非を返すことはできませんClass
Type
、あなた(またはGroovyの??)がこれを取得するために行わ何か間違っている必要がありますので、すべては仮定のように、Type
ですClass
。
Java配列リフレクションは、「instanceof」を実行できるクラスのインスタンスがない場合に使用します。たとえば、JPAのようにクラスの新しいインスタンスに値を注入する、ある種の注入フレームワークを作成している場合は、isArray()機能を使用する必要があります。
12月の初めにこれについてブログに書いた。 http://blog.adamsbros.org/2010/12/08/java-array-reflection/
反射ソリューションと非反射ソリューションのどちらかを選択する場合は、反射クラス(クラスオブジェクトを含む)を選択しないでください。それが「間違っている」などというわけではありませんが、反射に関連するものは一般にあまり明確ではなく、あまり明確ではありません。