Java反射:getMethods()和getDeclaredMethods()之间的区别

Rak*_*kib 29 java

有人可以详细说明这一点,并解释两种方法之间的区别,以及何时/为什么你想要使用其中一种方法

Thi*_*ilo 51

getDeclaredMethods包括类本身声明所有方法,而getMethods只返回公共方法,还返回从基类继承的方法(此处java.lang.Object).

Javadoc会告诉你的.

  • “也”可能暗示 `getMethods` 返回额外的元素以从 `getDeclaredMethods` 返回,这不一定是真的。值得一提的是,`getMethods` 会忽略非公共方法。 (2认同)

Ian*_*oyd 20

简洁版本

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
方法民众非公开遗传
getMethods()\xe2\x9c\x94\xef\xb8\x8f\xe2\x9d\x8c\xe2\x9c\x94\xef\xb8\x8f
getDeclaredMethods()\xe2\x9c\x94\xef\xb8\x8f\xe2\x9c\x94\xef\xb8\x8f\xe2\x9d\x8c
\n

长版

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n
方法获取方法()获取声明方法
民众\xe2\x9c\x94\xef\xb8\x8f\xe2\x9c\x94\xef\xb8\x8f
受保护的\xe2\x9d\x8c\xe2\x9c\x94\xef\xb8\x8f
私人的\xe2\x9d\x8c\xe2\x9c\x94\xef\xb8\x8f
静态公共\xe2\x9c\x94\xef\xb8\x8f\xe2\x9c\x94\xef\xb8\x8f
静电保护\xe2\x9d\x8c\xe2\x9c\x94\xef\xb8\x8f
静态私有\xe2\x9d\x8c\xe2\x9c\x94\xef\xb8\x8f
默认公开\xe2\x9c\x94\xef\xb8\x8f\xe2\x9c\x94\xef\xb8\x8f
默认保护\xe2\x9d\x8c\xe2\x9c\x94\xef\xb8\x8f
默认私有\xe2\x9d\x8c\xe2\x9c\x94\xef\xb8\x8f
继承的公共\xe2\x9c\x94\xef\xb8\x8f\xe2\x9d\x8c
继承保护\xe2\x9d\x8c\xe2\x9d\x8c
继承私有\xe2\x9d\x8c\xe2\x9d\x8c
inherited static private\xe2\x9c\x94\xef\xb8\x8f\xe2\x9d\x8c
inherited static protected\xe2\x9d\x8c\xe2\x9d\x8c
inherited static private\xe2\x9d\x8c\xe2\x9d\x8c
default inherited public\xe2\x9c\x94\xef\xb8\x8f\xe2\x9d\x8c
default inherited protected\xe2\x9d\x8c\xe2\x9d\x8c
default inherited private\xe2\x9d\x8c\xe2\x9d\x8c
\n
\n

If your goal, like mine, was to get public methods of a class:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodPublicNon-publicInherited
getMethods()\xe2\x9c\x94\xef\xb8\x8f\xe2\x9d\x8c\xe2\x9c\x94\xef\xb8\x8f
getDeclaredMethods()\xe2\x9c\x94\xef\xb8\x8f\xe2\x9c\x94\xef\xb8\x8f\xe2\x9d\x8c
getPublicMethods()\xe2\x9c\x94\xef\xb8\x8f\xe2\x9d\x8c\xe2\x9d\x8c
\n
\n

and nothing else:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodsgetPublicMethods()
public\xe2\x9c\x94\xef\xb8\x8f
protected\xe2\x9d\x8c
private\xe2\x9d\x8c
static public\xe2\x9d\x8c
static protected\xe2\x9d\x8c
static private\xe2\x9d\x8c
default public\xe2\x9d\x8c
default protected\xe2\x9d\x8c
default private\xe2\x9d\x8c
inherited public\xe2\x9d\x8c
inherited protected\xe2\x9d\x8c
inherited private\xe2\x9d\x8c
inherited static private\xe2\x9d\x8c
inherited static protected\xe2\x9d\x8c
inherited static private\xe2\x9d\x8c
default inherited public\xe2\x9d\x8c
default inherited protected\xe2\x9d\x8c
default inherited private\xe2\x9d\x8c
\n
\n

You have to do it yourself:

\n
Iterable<Method> getPublicMethods(Object o) {\n   List<Method> publicMethods = new ArrayList<>();\n\n   // getDeclaredMethods only includes methods in the class (good)\n   // but also includes protected and private methods (bad)\n   for (Method method : o.getClass().getDeclaredMethods()) {\n      if (!Modifier.isPublic(method.getModifiers())) continue; //only **public** methods\n      if (!Modifier.isStatic(method.getModifiers())) continue; //only public **methods**\n      publicMethods.add(method);\n   }\n   return publicMethods;\n}\n
Run Code Online (Sandbox Code Playgroud)\n