Использование .getDeclaredMethod для получения метода из класса, расширяющего

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

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

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

Ответы

Ответ 1

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

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

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

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

Это только найдет общедоступные методы. Если метод, которым вы пользуетесь, не является общедоступным, вы должны сами восстановить иерархию классов, используя 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();
}