2013-05-03 17 views
11

Próbuję użyć refleksji do ustalenia, czy przekazywana w klasie realizuje IsWdidget interfejs:Jak ustalić, czy klasa Java implementuje dany interfejs

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; 
} 

Czy to jest najlepszy/najbardziej skuteczny sposób z określając to? Widzę też IsWidget.class.isAssignableFrom(Class<?>) metoda ...

Odpowiedz

13

Chciałbym użyć metody isAssignableFrom celu ustalenia, czy IsWidget jest superinterface:

return IsWidget.class.isAssignableFrom(clzz); 

Cytując połączonego Javadoc powyżej:

Określa, czy klasy lub Interfejs reprezentowany przez ten obiekt klasy jest taki sam jak nadklasy lub superinterfejsu, klasa lub interfejs reprezentowany przez określony parametr klasy.

1

1) to nie ma sensu

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

spróbować tego z dowolnej klasy

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

dostaniesz

true 

więc jeśli usuwasz tę linię i działasz bezpośrednio przy pomocy clzz, która jest już wydajniejsza

2) Spróbuj

class X extends Thread { 
} 

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

dostaniesz

[] 

ten jest podobny do tego, co Twój func robi, ale w rzeczywistości X implementuje Runnable

3) i to jest naprawdę wydajne jednoliniowe rozwiązanie do sprawdzania, czy klasa implementuje interfejs

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

wyjście

true 
0

Jeśli to działa, powinno być dobrze. Możesz także spróbować wywołać metodę cast klasy Class i spróbować i złapać.

+0

To działa, ale naprawdę nadużywa punktu użycia bloku try/catch. Dodatkowo wyrzucony wyjątek sprawi, że połączenie będzie droższe niż to konieczne (chociaż nie jestem pewien, o ile bardziej efektywne byłoby użycie refleksji do określenia interfejsu implementującego). –

1

Możesz użyć metody getInterfaces(), jeśli masz obiekt Class.

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

Sposób getInterfaces daje tablicę Class reprezentujący interfaces. Albo można też użyć isAssignableFrom metodę następująco:

IsWidget.class.isAssignableFrom(clzz); 

Jeśli masz Object można użyć metody instanceof.

+0

To ustali, czy 'clzz' jest nadklasą 'IsWidget'; jest w tył. – rgettman

+0

@rgettman: Poprawiono. Dzięki za powiadomienie. :) –

Powiązane problemy