java中Class.getMethods()和Class.getDeclaredMethods()方法的区别

 更新时间:2018年09月12日 09:16:05   作者:freeTimeWY  
这篇文章主要介绍了java中Class.getMethods()和Class.getDeclaredMethods()方法的区别 ,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

在java中,可以根据Class类的对象,知道某个类(接口)的一些属性(成员 ,方法,注释,注解)等。由于最近的工作中用到了这些,其中需要在代码中格局反射知道某些类的方法,查看文档的时候,看到了getMethods()和getDeclaredMethods()的差异。虽然两者都能实现目的,但个人觉得还是有必要区分下。

  JDK API(1.6)文档中是这样翻译两个方法的:

getMethods():

  返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。数组类返回从 Object 类继承的所有(公共)member 方法。返回数组中的元素没有排序,也没有任何特定的顺序。如果此 Class 对象表示没有公共成员方法的类或接口,或者表示一个基本类型或 void,则此方法返回长度为 0 的数组。类初始化方法 <clinit> 不包含在返回的数组中。如果类声明了带有相同参数类型的多个公共成员方法,则它们都会包含在返回的数组中。

getDeclaredMethods():

  返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何方法,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。类初始化方法 <clinit> 不包含在返回数组中。如果该类声明带有相同参数类型的多个公共成员方法,则它们都包含在返回的数组中。

  大致上来看,两个方法的区别主要在于:getMethods()返回的是该类以及超类的公共方法。getDeclaredMethods()返回该类本身自己声明的包括公共、保护、默认(包)访问和私有方法,但并不包括超类中的方法。比如如下列子:

public class TestObject
{
  private void method1()
  {
  }
  public void method2()
  {
  }
  void method3()
  {
  }
  protected void method4()
  {
  }
}
public class TestClass
{
  public static void main(String[] args)
  {
    Method[] methods = TestObject.class.getMethods();
    System.out.println("getMethods():");
    for (Method method : methods)
    {
      System.out.println(method.getName());
    }
    Method[] methods2 = TestObject.class.getDeclaredMethods();
    System.out.println("===========================");
    System.out.println("getDeclaredMethods():");
    for (Method method : methods2)
    {
      System.out.println(method.getName());
    }
  }
}

运行TestClass结果:

getMethods():
method2
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
===========================
getDeclaredMethods():
method1
method2
method3
method4

  很明显getMethods()就返回一个自己声明的method2()方法,其余的方法全部是来自Object类。getDeclaredMethods()返回了自生声明的四个方法。两个方法的主要区别就在这里吧。

另外,返回Method数组为0 的情况也是JDK按照文档上介绍的一样。比如”空”接口,基本类型:

public interface TestInterface
{
}
//两种方法返回的都是空

以及基本类型:两种方法返回的也都是空

Method[] methods = int.class.getMethods();
Method[] methods2 = int.class.getDeclaredMethods();

总结:其实Class中有很多相似的方法比如:getAnnotations()getDeclaredAnnotations(),以及getFields()和getDeclaredFields()等等,不同之处和上面基本一样

总结

以上所述是小编给大家介绍的java中Class.getMethods()和Class.getDeclaredMethods()方法的区别,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Java中Integer的parseInt和valueOf的区别详解

    Java中Integer的parseInt和valueOf的区别详解

    这篇文章主要介绍了Java中Integer的parseInt和valueOf的区别详解,nteger.parseInt(s)是把字符串解析成int基本类型,Integer.valueOf(s)是把字符串解析成Integer对象类型,其实int就是Integer解包装,Integer就是int的包装,需要的朋友可以参考下
    2023-11-11
  • Java中Stringbuild,Date和Calendar类的用法详解

    Java中Stringbuild,Date和Calendar类的用法详解

    这篇文章主要为大家详细介绍了Java中Stringbuild、Date和Calendar类的用法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-04-04
  • 深入理解Java之jvm启动流程

    深入理解Java之jvm启动流程

    这篇文章主要介绍了深入理解Java之jvm启动流程,文章内容讲解的很清晰,有对这方面感兴趣的同学可以研究下
    2021-02-02
  • 在VSCode里使用Jupyter Notebook调试Java代码的详细过程

    在VSCode里使用Jupyter Notebook调试Java代码的详细过程

    Jupyter Notebook是以网页的形式打开,可以在网页页面中直接编写代码和运行代码,代码的运行结果也会直接在代码块下显示的程序,这篇文章主要介绍了在VSCode里使用Jupyter Notebook,调试Java代码,需要的朋友可以参考下
    2022-07-07
  • 详解Java中日志跟踪的简单实现

    详解Java中日志跟踪的简单实现

    MDC​(Mapped Diagnostic Context,映射调试上下文)是 log4j​ 、logback及log4j2​ 提供的一种方便在多线程条件下记录日志的功能。本文将利用MDC实现简单的日志跟踪,需要的可以参考一下
    2022-08-08
  • elasticsearch源码分析index action实现方式

    elasticsearch源码分析index action实现方式

    这篇文章主要为大家介绍了elasticsearch源码分析index action实现方式,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • 图文详解Java中class的初始化顺序

    图文详解Java中class的初始化顺序

    网上有很多关于Java中class的初始化顺序文章,但是本文通过图文更加详细的介绍了Java中class的初始化顺序,并对class的装载顺序进行了讲解,下面一起来看看。
    2016-08-08
  • 浅谈Spring中的循环依赖问题与解决方案

    浅谈Spring中的循环依赖问题与解决方案

    这篇文章主要介绍了浅谈Spring中的循环依赖问题与解决方案,循环依赖就是两个或则两个以上的bean互相持有对方,最终形成闭环,比如A依赖于B,B依赖于C,C又依赖于A,需要的朋友可以参考下
    2023-12-12
  • 记一次Maven项目改造成SpringBoot项目的过程实践

    记一次Maven项目改造成SpringBoot项目的过程实践

    本文主要介绍了Maven项目改造成SpringBoot项目的过程实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Spring Boot整合EhCache的步骤详解

    Spring Boot整合EhCache的步骤详解

    EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认CacheProvider。这篇文章主要介绍了Spring Boot整合EhCache的步骤详解,需要的朋友可以参考下
    2020-02-02

最新评论