Can someone please elaborate on this, and explain the difference between the two methods, and when/why you would want to use one over the others
getDeclaredMethods
includes all methods declared by the class itself, whereas getMethods
returns only public methods, but also those inherited from a base class (here from java.lang.Object
).
Read more about it in the Javadocs for getDeclaredMethod
and getMethods
.
Method | Public | Non-public | Inherited |
---|---|---|---|
getMethods() |
✔️ | ❌ | ✔️ |
getDeclaredMethods() |
✔️ | ✔️ | ❌ |
Methods | getMethods() | getDeclaredMethods |
---|---|---|
public | ✔️ | ✔️ |
protected | ❌ | ✔️ |
private | ❌ | ✔️ |
static public | ✔️ | ✔️ |
static protected | ❌ | ✔️ |
static private | ❌ | ✔️ |
default public | ✔️ | ✔️ |
default protected | ❌ | ✔️ |
default private | ❌ | ✔️ |
inherited public | ✔️ | ❌ |
inherited protected | ❌ | ❌ |
inherited private | ❌ | ❌ |
inherited static private | ✔️ | ❌ |
inherited static protected | ❌ | ❌ |
inherited static private | ❌ | ❌ |
default inherited public | ✔️ | ❌ |
default inherited protected | ❌ | ❌ |
default inherited private | ❌ | ❌ |
If your goal, like mine, was to get public methods of a class:
Method | Public | Non-public | Inherited |
---|---|---|---|
getMethods() |
✔️ | ❌ | ✔️ |
getDeclaredMethods() |
✔️ | ✔️ | ❌ |
getPublicMethods() | ✔️ | ❌ | ❌ |
and nothing else:
Methods | getPublicMethods() |
---|---|
public | ✔️ |
protected | ❌ |
private | ❌ |
static public | ❌ |
static protected | ❌ |
static private | ❌ |
default public | ❌ |
default protected | ❌ |
default private | ❌ |
inherited public | ❌ |
inherited protected | ❌ |
inherited private | ❌ |
inherited static private | ❌ |
inherited static protected | ❌ |
inherited static private | ❌ |
default inherited public | ❌ |
default inherited protected | ❌ |
default inherited private | ❌ |
You have to do it yourself:
Iterable<Method> getPublicMethods(Object o) {
List<Method> publicMethods = new ArrayList<>();
// getDeclaredMethods only includes methods in the class (good)
// but also includes protected and private methods (bad)
for (Method method : o.getClass().getDeclaredMethods()) {
if (!Modifier.isPublic(method.getModifiers())) continue; //only **public** methods
if (!Modifier.isStatic(method.getModifiers())) continue; //only public **methods**
publicMethods.add(method);
}
return publicMethods;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With