2013-07-30 2 views
19

Так что скажем, я пытаюсь получить метод из класса с помощью Method m = plugin.getClass().getDeclaredMethod("getFile");.Использование .getDeclaredMethod для получения метода из класса, расширяющего другой

Но класс plugin распространяется на другой класс, который является одним из методов getFile. Я не совсем уверен, что это заставит его выбросить исключение NoSuchMethodException или нет.

Я знаю класс, который удлиняет plugin, имеет метод getFile. Извините, если я сбиваю с толку, немного устал.

ответ

55

Похоже, вам просто нужно использовать getMethod вместо getDeclaredMethod. Вся суть в том, что getDeclaredMethod это только находит методы, объявленные в классе вы вызываете его на:

Возвращает объект метода, который отражает указанный объявленный метод класса или интерфейса, представленного данным объектом класса ,

В то время как getMethod имеет:

С искали любые способы согласования. Если ни один метод сопоставления не найден, алгоритм шага 1 вызывается рекурсивно суперкласса С.

Это будет только найти общественные методы, хотя. Если метод вы после не является публичной, вы должны рекурсию до иерархии классов самостоятельно, используя getDeclaredMethod или getDeclaredMethods на каждом классе в иерархии:

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, лучшее решение, чем я. – rgettman

+0

Если это помогает, причина, по которой я использую это, связана с тем, что метод является частным в первую очередь. Энн, тогда вы редактируете. Хорошо, я попробую отредактировать. – PaulBGD

+0

@Ultimate: Ну да, это очень важно. Это помогло бы, если бы вы упомянули об этом для начала. –

Смежные вопросы