![](/img/trans.png)
[英]Java - reflection getDeclaredMethods in declared order strange behaviour
[英]Java Reflection: Difference between getMethods() and getDeclaredMethods()
有人可以详细说明一下,并解释这两种方法之间的区别,以及何时/为什么要使用其中一种方法而不是其他方法
getDeclaredMethods
包括由类本身声明的所有方法,而getMethods
只返回公共方法,但也包括从基类(这里是java.lang.Object
)继承的方法。
在getDeclaredMethod
和getMethods
的 Javadocs 中阅读有关它的更多信息。
方法 | 上市 | 非公开 | 遗传 |
---|---|---|---|
getMethods() |
✔️ | ❌ | ✔️ |
getDeclaredMethods() |
✔️ | ✔️ | ❌ |
方法 | 获取方法() | getDeclaredMethods |
---|---|---|
上市 | ✔️ | ✔️ |
受保护 | ❌ | ✔️ |
私人的 | ❌ | ✔️ |
静态公共 | ✔️ | ✔️ |
静电保护 | ❌ | ✔️ |
静态私有 | ❌ | ✔️ |
默认公开 | ✔️ | ✔️ |
默认保护 | ❌ | ✔️ |
默认私有 | ❌ | ✔️ |
继承公众 | ✔️ | ❌ |
继承保护 | ❌ | ❌ |
继承私有 | ❌ | ❌ |
继承的静态私有 | ✔️ | ❌ |
继承的静态保护 | ❌ | ❌ |
继承的静态私有 | ❌ | ❌ |
默认继承公共 | ✔️ | ❌ |
默认继承受保护 | ❌ | ❌ |
默认继承私有 | ❌ | ❌ |
如果你的目标和我一样,是获取一个类的公共方法:
方法 | 上市 | 非公开 | 遗传 |
---|---|---|---|
getMethods() |
✔️ | ❌ | ✔️ |
getDeclaredMethods() |
✔️ | ✔️ | ❌ |
获取公共方法() | ✔️ | ❌ | ❌ |
仅此而已:
方法 | 获取公共方法() |
---|---|
上市 | ✔️ |
受保护 | ❌ |
私人的 | ❌ |
静态公共 | ❌ |
静电保护 | ❌ |
静态私有 | ❌ |
默认公开 | ❌ |
默认保护 | ❌ |
默认私有 | ❌ |
继承公众 | ❌ |
继承保护 | ❌ |
继承私有 | ❌ |
继承的静态私有 | ❌ |
继承的静态保护 | ❌ |
继承的静态私有 | ❌ |
默认继承公共 | ❌ |
默认继承受保护 | ❌ |
默认继承私有 | ❌ |
你必须自己做:
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.