2012-01-13 12 views
27

Il seguente codice è valido?Il controllo di un tipo di classe (.class) è uguale ad un altro tipo di classe

void myMethod (Class classType) { 
    if (classType == MyClass.class) { 
     // do something 
    } 
} 

myMethod (OtherClass.class); 

Se non c'è alcun altro approccio in cui posso controllare se una .class passati (tipo Class) è di tipo - MiaClasse?

Grazie!

+0

Non dimenticare di accettare risposte o commenti se le risposte non soddisfano le tue esigenze Fahim. La risposta di Jon è impeccabile (come al solito). –

risposta

43

Sì, quel codice è valido - se le due classi sono state caricate dallo stesso classloader. Se vuoi che le due classi vengano trattate come uguali anche se sono state caricate dal diversi programmi di caricamento classe, possibilmente da posizioni diverse, in base al nome completo, devi solo confrontare i nomi completi.

Nota che il codice considera solo esatta partita, tuttavia - non fornirà il tipo di "compatibilità assegnazione" che (diciamo) instanceof fa quando vedere se un valore si riferisce ad un oggetto che è un'istanza di una determinata classe. Per questo, vorresti dare un'occhiata a Class.isAssignableFrom.

3

Preferirei confrontare i nomi canonici per essere completamente sicuri, classType.getCanonicalName(). Equals (MyClass.class.getCanonicalName()).

Nota che questo potrebbe causare problemi con le classi anonime e interne, se li stai utilizzando potresti prendere in considerazione l'uso di getName.

2

che ha funzionato per me

public class Test 
{ 

void myMethod (Class classType) { 
    System.out.println(classType.isAssignableFrom(Test.class)); 
} 

public static void main(String[] args) { 
    Test t = new Test(); 
    t.myMethod(String.class); 

} 

} 
1

Penso che si sta cercando instanceof.

Animal a = new Tiger(); 
System.out.println(a instanceof Tiger); // true 
System.out.println(a instanceof Animal); //true 

In alternativa è possibile confrontare due classi con

a.getClass() == b.getClass() 
+4

'instanceof' restituisce' true' anche per sottoclassi, che probabilmente non è quello che OP vuole – user11153

+1

La domanda era sul confronto tra le classi effettive, non sul confronto degli oggetti. –

0

Non usare classType.getCanonicalName().equals(MyClass.class.getCanonicalName()) quanto sopra non prenderà in considerazione eventuali farmaci generici (tutto il programma sono gli stessi, tutti insieme sono gli stessi, ecc)

Problemi correlati