2012-11-15 6 views
22

Ecco una variabile Class<?> cls, ora voglio ottenere un altro Array Class Object quale tipo di componente è cls.su java: ottieni `String []. Class` da` String.class`, cosa succede se `String.class` è un" tipo di runtime "?

Ad esempio, se cls = String.class, voglio ottenere String[].class; se cls = int.class, voglio ottenere int[].class, cosa devo fare?

Vedete, è abbastanza facile da ottenere String.class da String[].class:

Class<?> arrayCls = String[].class; 
if(arrayCls.isArray()){ 
    Class<?> cls = arrayCls.getComponentType(); 
} 

Ma non riesco a trovare modo semplice di fare il contrario. ci

Class<?> clazz = String.class; 
Class<?> arrayClass = Array.newInstance(clazz,0).getClass(); 

è alcun modo la pastella per fare questo per favore:

Ecco una possibile soluzione?

+1

Cosa c'è di sbagliato in questa soluzione? – Thilo

+0

@Thilo La soluzione è il risultato della mia ipotesi. Funziona bene, ma non sono sicuro se questo è il modo migliore. Questa soluzione deve creare dinamicamente un'entità dell'array la cui lunghezza è 0. – watchzerg

+0

Interessante domanda. Sei curioso di sapere perché hai bisogno dell'array 'Class' object? –

risposta

8

Forse provare Class.forName(String)?

Modifica: ecco uno snippet di codice.

Class<?> arrayClass = String[].class; 
System.out.println(arrayClass); 
Class<?> namedClass = Class.forName("[L" + String.class.getName() + ";"); 
System.out.println(namedClass); 
System.out.println(arrayClass == namedClass); 
+1

Secondo la classe XMLEncoder in jdk, 'Class.forName (String)' è il metodo standard per farlo. Grazie amico. 'Classe cls = String.class; Classe arrayCls = Class.forName ("[L" + cls.getName() + ";"); 'http://stackoverflow.com/questions/4581394/getting-the-class-of-an-n-dimensional -array-of-an-runtime-fornito-nome-classe – watchzerg

+0

Ah. Alla fine ho dimenticato il punto e virgola. – zienkikk

+2

Personalmente preferisco la tua soluzione usando 'Array.newInstance'. Questo almeno utilizza funzionalità documentate. Ma il prefisso del nome '[L' è una convenzione interna. In futuro potrebbero cambiarlo e cambiare la classe 'XMLEncoder', perché anche questo fa parte del JDK. Solo perché qualcosa fa qualcosa in un certo modo nel JDK, non significa che è il modo in cui dovresti farlo, perché stai scrivendo il codice dell'applicazione piuttosto che il codice JDK. – Kidburla

11

Un altro trucco che ho trovato è l'utilizzo di vararg sul metodo util.

public static void main(String[] args) throws ClassNotFoundException { 

    Class<?> demo = Main.<String>getArrayClass(); 
    System.out.println(demo); 
} 

static <T> Class getArrayClass(T... param){ 
    return param.getClass(); 
} 
+1

Bel trucco +1 In realtà se si specifica 'T' sul sito di chiamata non è necessario passare alcun argomento:' MyClass. getArrayClass(); ' –

+0

sì buon suggerimento :) Ho aggiornato! – HRgiger

+4

Perché questo non restituirà la classe di 'Object []' ogni volta a causa della cancellazione del tipo di runtime? – SpaceTrucker

10

risposta di HRgiger migliorato:

@SuppressWarnings("unchecked") 
static <T> Class<? extends T[]> getArrayClass(Class<T> clazz) { 
    return (Class<? extends T[]>) Array.newInstance(clazz, 0).getClass(); 
} 

Entrambi istanziare un oggetto array quando viene richiamato. Per ottenere il tipo di matrice, utilizzare

Class<?> childType = ...; 
Class<?> arrayType = getArrayClass(childType); 
+0

Questo non ha nulla a che fare con la risposta di HRgiger, questo è un miglioramento di ciò che l'OP ha pubblicato nella domanda. – Holger

+0

Inoltre, sono abbastanza sicuro che stai creando un'istanza di un nuovo oggetto qui, ogni volta, che l'altra risposta non è. –

Problemi correlati