2012-10-22 18 views
7

Ich mache nicht viel von der Reflexion, so dass diese Frage offensichtlich sein könnte. Für z.B. Ich habe eine Klasse:Überprüfen Sie, ob java.lang.reflect.Field Typ ein Byte-Array ist

public class Document { 

    private String someStr;  

    private byte[] contents; 

    //Getters and setters 

} 

ich zu überprüfen, ich versuche, wenn das Feld contents eine Instanz von Byte-Array ist. Was ich versucht:

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

Der Ausgang dieses Codes ist: class [B. Ich sehe, dass Byte-Array gefunden wird, aber wenn ich tun:

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

Diese Bedingung ist nie true. Warum das? Und wie überprüft man, ob das Objekt Felder vom Typ byte[] enthält?

Antwort

15

array instanceof byte[] prüft, ob array ist ein Objekt vom Typ byte[]. Aber in Ihrem Fall array ist kein byte[], es ist ein Objekt vom Typ Class, das byte[] darstellt.

Sie können einen Class zugreifen, die eine Art T als T.class darstellt, daher müssen Sie die folgende Kontrolle:

if (array == byte[].class) { ... } 
+0

Danke, jetzt bekomme ich es :) –

0

Wenn Sie versuchen:

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

druckt byte[]. Aber @ axtavts Antwort ist besser.

7

, wenn das Array eine Klasse ist nur instanceof Class wird wahr sein ..

Wenn Sie wollen die Art eines Feldes überprüfen Sie diese

if(field.getType() == byte[].class) 
3

Versuchen verwenden:

Class<?> cls = field.getType(); 
if (cls.isAssignableFrom(byte[].class)) { 
    System.out.println("It's a byte array"); 
} 
Verwandte Themen