2012-10-22 13 views
7

Non faccio molta riflessione, quindi questa domanda potrebbe essere ovvia. Ad es. Ho una classe:Controlla se java.lang.reflect.Field type è un array di byte

public class Document { 

    private String someStr;  

    private byte[] contents; 

    //Getters and setters 

} 

Sto cercando di verificare se il campo contents è un esempio di array di byte. Quello che ho provato:

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

L'uscita di questo codice è: class [B. Vedo che array di byte viene trovato, ma se lo faccio:

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

questa condizione è mai true. Perché? E come verificare se l'oggetto contiene campi che sono di tipo byte[]?

risposta

15

array instanceof byte[] verifica se array è un oggetto di tipo byte[]. Ma nel tuo caso array non è un , è un oggetto di tipo Class che rappresenta byte[].

È possibile accedere a un Class che rappresenta un certo tipo T come T.class, pertanto è necessario il seguente controllo:

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

Grazie, ora ho capito :) –

0

se provate:

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

la stampa byte[]. Ma la risposta di @ axtavt è migliore.

7

se la matrice è una classe unica instanceof Class sarà vero ..

Se consiglia di controllare il tipo di un campo è possibile utilizzare

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

Prova questa:

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