PaulBGD PaulBGD - 5 days ago 6
Java Question

Using .getDeclaredMethod to get a method from a class extending another

So lets say I am trying to get a method from a class using

Method m = plugin.getClass().getDeclaredMethod("getFile");
.

But that
plugin
class is extending another class, which is the one with the
getFile
method. I am not quite sure if that would make it throw the
NoSuchMethodException
exception or not.

I know the class that the
plugin
is extending has the getFile method.
Sorry if I sound confusing, a bit tired.

Answer

It sounds like you just need to use getMethod instead of getDeclaredMethod. The whole point of getDeclaredMethod is that it only finds methods declared in the class you're calling it on:

Returns a Method object that reflects the specified declared method of the class or interface represented by this Class object.

Whereas getMethod has:

C is searched for any matching methods. If no matching method is found, the algorithm of step 1 is invoked recursively on the superclass of C.

That will only find public methods though. If the method you're after isn't public, you should recurse up the class hierarchy yourself, using getDeclaredMethod or getDeclaredMethods on each class in the hierarchy.

EDIT: Okay, now that we know it's a private method...

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();
}
Comments