繁体   English   中英

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

[英]Java Reflection: Difference between getMethods() and getDeclaredMethods()

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

getDeclaredMethods包括由类本身声明所有方法,而getMethods只返回公共方法,但也包括从基类(这里是java.lang.Object )继承的方法。

getDeclaredMethodgetMethods的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM