当前位置: 首页 > 编程笔记 >

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

方和豫
2023-03-14
本文向大家介绍java中Class.getMethods()和Class.getDeclaredMethods()方法的区别,包括了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()方法的区别,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!

 类似资料:
  • 问题内容: 我只是在阅读教科书中给我的课文,我不确定自己是否明白我在说什么。这基本上是在告诉我静态方法或类方法包括关键字“修饰符” static。但是我真的不知道那意味着什么吗? 有人可以简单地向我解释什么是静态方法或类方法吗? 另外,我可以简单解释一下什么是Instance方法吗? 这是他们在教科书中给我的: 存在或不存在静态修饰符具有重要的实际意义。一旦Java处理了它所属的类的定义,就可以调

  • 问题内容: 在其他更改中,JDK 11为java.lang.String类引入了6种新方法: -重复字符串多次通过所提供的参数 -使用分隔符从源字符串懒惰地提供行 -指示字符串是否为空或仅包含空格字符 -从开头删除空白 -从末端去除空白 -删除字符串开头和结尾的空格 尤其看起来与十分相似。按照本文的规定, 方法旨在: String.strip(),String.stripLeading()和Str

  • 在Java 8中,和方法有什么区别?

  • 问题内容: 我阅读了Java文档,但无法弄清楚这两种方法之间的主要区别是什么。有时我用了,有时是,有时是一个做我想做的,有时是另一个。 那么,两者的主要区别是什么?我应该使用哪一个和? 问题答案: 简短的答案是:很复杂。 稍长一点的答案是:如果组件的父级没有布局管理器,以及与之相关的组件(如果有),则使用。 如果组件的父级使用布局管理器,则可能什么都不做;通常会对其产生影响的位置将位于顶级组件(和

  • 我们已经试用了一个示例程序,以了解Java 6的中和方法之间的区别。但他们似乎是一样的,有什么建议吗?

  • 本文向大家介绍JavaScript中的toString()和toLocaleString()方法的区别,包括了JavaScript中的toString()和toLocaleString()方法的区别的使用技巧和注意事项,需要的朋友参考一下 偶然之间用到这两个方法 然后在数字转换成字符串的时候,并没有感觉这两个方法有什么区别,如下:  是吧,并没有什么区别 再继续看数组转成字符串分别用这两个方法有什