web-dev-qa-db-ja.com

オブジェクトがリフレクションを使用せずに配列であるかどうかを確認するにはどうすればよいですか?

オブジェクトがリフレクションを使用せずに配列である場合、Javaでどのように確認できますか?リフレクションを使用せずにすべての項目を反復処理するにはどうすればよいですか?

Google GWTを使用しているため、リフレクションを使用することはできません:(

反射を使用せずに次のメソッドを実装したいと思います。

private boolean isArray(final Object obj) {
  //??..
}

private String toString(final Object arrayObject) {
  //??..
}

ところで:また、非GWT環境で使用できるようにJavaScriptを使用したくありません。

88
edbras

Class.isArray()を使用できます

public static boolean isArray(Object obj)
{
    return obj!=null && obj.getClass().isArray();
}

これは、オブジェクト配列とプリミティブ型配列の両方で機能します。

ToStringについては、Arrays.toString。配列タイプを確認し、適切なtoStringメソッドを呼び出す必要があります。

226
Steve Kuo

次のコードを使用して、配列の各要素に個別にアクセスできます。

Object o=...;
if ( o.getClass().isArray() ) {
    for(int i=0; i<Array.getLength(o); i++){
        System.out.println(Array.get(o, i));
    }
}

これはどの配列でも機能するため、どのような基本配列であるかを知る必要がないことに注意してください。

32
user1928596

プリミティブ型の配列間、またはプリミティブ型の配列と参照型の配列の間にはサブタイプ関係がありません。 JLS 4.10. を参照してください。

したがって、以下はobjがあらゆる種類の配列であるかどうかを確認するテストとしては正しくありません

_// INCORRECT!
public boolean isArray(final Object obj) {
    return obj instanceof Object[];
}
_

具体的には、objがプリミティブの1次元配列の場合は機能しません。 (ただし、すべての配列タイプはObjectのサブタイプであるため、高次元のプリミティブ配列に対しても機能します。しかし、この場合は意味がありません。)

Google GWTを使用しているため、リフレクションを使用することはできません:(

(質問のisArray配列部分に対する)最善の解決策は、「反射を使用する」と見なされるものに依存します。

  • GWTでは、obj.getClass().isArray()の呼び出しはリフレクションの使用としてカウントされません1、それが最善の解決策です。

  • それ以外の場合、オブジェクトに配列型があるかどうかを判断する最良の方法は、一連のinstanceof式を使用することです。

    _public boolean isArray(final Object obj) {
        return obj instanceof Object[] || obj instanceof boolean[] ||
           obj instanceof byte[] || obj instanceof short[] ||
           obj instanceof char[] || obj instanceof int[] ||
           obj instanceof long[] || obj instanceof float[] ||
           obj instanceof double[];
    }
    _
  • 次のようにオブジェクトのクラスの名前をいじってみることもできますが、obj.getClass()の呼び出しはリフレクションの境界になっています。

    _public boolean isArray(final Object obj) {
        return obj.getClass().toString().charAt(0) == '[';
    }
    _

1-より正確には、_Class.isArray_メソッドは このページ でGWTでサポートされているものとしてリストされています。

9
Stephen C

クラスがCollectionMap、またはArrayを表すかどうかを確認するユーティリティクラスを作成できます。

  public static boolean isCollection(Class<?> rawPropertyType) {
        return Collection.class.isAssignableFrom(rawPropertyType) || 
               Map.class.isAssignableFrom(rawPropertyType) || 
               rawPropertyType.isArray();
 }
0
Lucas Pires