9

私は熟考をあまりしないので、この質問は明らかかもしれません。たとえば、クラスがあります:

public class Document {

    private String someStr;    

    private byte[] contents;  

    //Getters and setters

}

フィールドcontentsがバイト配列のインスタンスであるかどうかを確認しようとしています。私が試したこと:

Class clazz = Document.class;
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
    if (field.getType().isArray()) {
        Object array = field.getType();
        System.out.println(array);
    }
}

このコードの出力は次のとおりclass [Bです。バイト配列が見つかったことがわかりますが、見つかった場合:

if (array instanceof byte[]) {...}

この状態は決してtrue. 何故ですか?また、オブジェクトに次のタイプのフィールドが含まれているかどうかを確認する方法はbyte[]?

4

6 に答える 6

19

array instanceof byte[]arrayが type のオブジェクトかどうかをチェックしますbyte[]。しかし、あなたの場合arrayは ではなく、を表すbyte[]タイプのオブジェクトです。Classbyte[]

としてClass何らかの型を表す にアクセスできるため、次のチェックが必要です。TT.class

if (array == byte[].class) { ... }
于 2012-10-22T09:49:06.517 に答える
7

配列がクラスの場合のみinstanceof Classtrue になります。

使用できるフィールドのタイプを確認したい場合

if(field.getType() == byte[].class)
于 2012-10-22T09:49:23.040 に答える
4

これを試して:

Class<?> cls = field.getType();
if (cls.isAssignableFrom(byte[].class)) {
    System.out.println("It's a byte array");
}
于 2012-10-22T09:51:52.593 に答える
1

Oracle のこの便利なチュートリアルを参照してください

配列型は Class.isArray() を呼び出すことで識別できます

于 2012-10-22T09:49:06.573 に答える
0

試してみると:

Class<?> array = field.getType();
System.out.println(array.getCanonicalName());

それは印刷しbyte[]ます。しかし、@axtavt の答えの方が優れています。

于 2012-10-22T09:48:56.677 に答える