2013-07-30 11 views
19

Powiedzmy, że próbuję uzyskać metodę z klasy przy użyciu Method m = plugin.getClass().getDeclaredMethod("getFile");.Korzystanie z .getDeclaredMethod do uzyskania metody z klasy rozszerzającej inną

Ale ta klasa plugin rozszerza kolejną klasę, która jest metodą getFile. Nie jestem do końca pewien, czy spowodowałoby to odrzucenie wyjątku NoSuchMethodException.

Wiem, że klasa, którą rozszerza plugin, ma metodę getFile. Przepraszam, jeśli zabrzmi to myląco, trochę zmęczony.

Odpowiedz

55

Wygląda na to, że wystarczy użyć getMethod zamiast getDeclaredMethod. Sensem getDeclaredMethod jest to, że tylko znajdzie metod zadeklarowanych w klasie Dzwonisz go na:

Zwraca obiekt metodę uwzględniającą określony zadeklarowanej metody klasy lub interfejsu reprezentowany przez obiekt klasy .

Zważywszy getMethod posiada:

C szukał wszelkich sposobów dopasowywania. Jeśli nie zostanie znaleziona żadna metoda dopasowywania, algorytm kroku 1 jest wywoływana rekurencyjnie na nadklasy C.

Że znajdzie tylko publicznych metod chociaż. Jeśli metoda jesteś po nie jest publiczna, powinien recurse górę hierarchii klas siebie, używając getDeclaredMethod lub getDeclaredMethods z każdej klasy w hierarchii:

Class<?> clazz = plugin.getClass(); 
while (clazz != null) { 
    Method[] methods = clazz.getDeclaredMethods(); 
    for (Method method : methods) { 
     // Test any other things about it beyond the name... 
     if (method.getName().equals("getFile") && ...) { 
      return method; 
     } 
    } 
    clazz = clazz.getSuperclass(); 
} 
+0

+1, lepsze rozwiązanie niż miałem. – rgettman

+0

Jeśli to pomaga, powodem, dla którego go używam, jest przede wszystkim metoda prywatna. Annd wtedy edytujesz. W porządku, spróbuję edycji. – PaulBGD

+0

@Ultimate: Cóż, tak, to całkiem ważne. Pomogłoby, gdybyś wspomniał o tym na początku. –

Powiązane problemy