2013-05-03 11 views
11

Sto cercando di utilizzare la reflection per determinare se un passato in classe implementa un'interfaccia IsWdidget:Come determinare se una classe Java implementa una particolare interfaccia

public boolean isAWidget(Class<?> clzz) { 
    Class<?> runtimeClass = ClassLoader.getSystemClassLoader().loadClass(clzz.getName()); 
    Class<?>[] impls = runtimeClass.getInterfaces(); 
    for(Class<?> clz : impls) 
     if(clz.getName().equals(IsWidget.class.getName())) 
      return true; 

    return false; 
} 

È questo il modo migliore/più efficiente di determinare questo? Vedo anche un metodo di IsWidget.class.isAssignableFrom(Class<?>) ...

risposta

13

userei il metodo isAssignableFrom per determinare se IsWidget è un superinterfaccia:

return IsWidget.class.isAssignableFrom(clzz); 

citare Javadoc linkato sopra:

determina se la classe o l'interfaccia rappresentata da questo oggetto di classe è uguale o superclasse o superinterfaccia di classe o interfaccia rappresentata dal parametro di classe specificato.

1

1) Questo non ha senso

Class<?> runtimeClass = ClassLoader.getSystemClassLoader().loadClass(clzz.getName()); 

provare questo con qualsiasi classe

Class<?> runtimeClass = ClassLoader.getSystemClassLoader().loadClass(clzz.getName()); 
    System.out.println(runtimeClass == clzz); 

otterrete

true 

quindi se rimuovi questa linea e lavori direttamente con clzz è già più efficiente

2) Prova questa

class X extends Thread { 
} 

public static void main(String[] args) throws ClassNotFoundException { 
    System.out.print(Arrays.toString(X.class.getInterfaces())); 
} 

si otterrà

[] 

questo è simile a ciò che il vostro func sta facendo, ma di fatto X implementa Runnable

3) e questo è davvero efficiente soluzione a una linea per verificare se una classe implementa un'interfaccia

System.out.print(Runnable.class.isAssignableFrom(X.class)); 

uscita

true 
0

Se funziona, dovrebbe andare bene. Puoi anche provare a chiamare il metodo cast della classe Class e fare un tentativo e prendere.

+0

Questo funziona, ma in realtà abusa del punto di utilizzare un blocco try/catch. Inoltre, l'eccezione generata renderà la chiamata più costosa di quella che deve essere (anche se non sono sicuro di quanto sarebbe più efficiente utilizzare la reflection per determinare l'interfaccia di implementazione) –

1

È possibile utilizzare il metodo getInterfaces() se si dispone di un oggetto Class.

Class c[] = clzz.getInterfaces(); 
    if(Arrays.asList(c).contains(IsWidget.class)) 
    { 
     return true; 
    } 

Il metodo getInterfaces ti dà una serie di Class che rappresenta il interfaces. Oppure si potrebbe anche usare isAssignableFrom metodo come segue:

IsWidget.class.isAssignableFrom(clzz); 

Se si dispone di un Object è possibile utilizzare il metodo instanceof.

+0

Questo determinerà se 'clzz' è una superclasse di 'IsWidget'; è indietro. – rgettman

+0

@rgettman: corretto. Grazie per la notifica. :) –

Problemi correlati