2012-10-22 5 views
7

Nie robię wiele refleksji, więc to pytanie może być oczywiste. Dla np. Mam klasy:Sprawdź, czy typ java.lang.reflect.Field jest tablicą bajtów

public class Document { 

    private String someStr;  

    private byte[] contents; 

    //Getters and setters 

} 

próbuję sprawdzić czy pole contents jest instancją tablicy bajtów. Co próbowałem:

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

Dane wyjściowe tego kodu: class [B. Widzę, że tablica bajtów zostanie znaleziony, ale jeśli to zrobię:

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

Warunek ten nigdy true jest. Dlaczego? A jak sprawdzić, czy obiekt zawiera pola typu byte[]?

Odpowiedz

15

array instanceof byte[] sprawdza, czy array jest obiektem typu byte[]. Ale w twoim przypadku array nie jest byte[], jest obiektem typu Class, który reprezentuje byte[].

można uzyskać dostęp do Class który reprezentuje pewien rodzaj T jako T.class, więc trzeba następujące sprawdzenia:

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

Dzięki, teraz rozumiem :) –

0

Jeśli spróbujesz:

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

drukuje byte[]. Ale odpowiedź @ aktavt jest lepsza.

7

jeśli tablica jest klasą tylko instanceof Class będzie prawdziwa ..

Jeśli aby sprawdzić typ pola można użyć

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

Spróbuj tego:

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