1. ホーム
  2. java

[解決済み] Java配列のリフレクション:isArrayとinstanceofの比較

2022-04-16 15:57:25

質問

使用する際に、好みや動作の違いはありますか?

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レベルでは instanceof 演算子は、特定の "インスタンスオブ" バイトコードで、ほとんどのJVM実装で最適化されています。

稀なケースとして、未知の型のオブジェクトグラフをトラバースするためにリフレクションを使用することがあります。このような場合 isArray() 例えば、ある種の直列化機構を実装していて、配列の各コンポーネントを型に関係なく同じ直列化メソッドに渡すことができるかもしれません。

NULL参照とプリミティブ配列への参照の2つの特殊なケースがあります。

ヌル参照は instanceof という結果になります。 false を使用し、一方 isArray を投げる。 NullPointerException .

プリミティブ配列に適用すると instanceof となります。 false ただし、右側のオペランドにあるコンポーネント型と完全に一致する場合はこの限りではありません。これに対して isArray() を返します。 true は、どのようなコンポーネントタイプにも対応します。