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

作者:freeTimeWY 时间:2021-05-28 23:05:46 

在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()方法的区别网站的支持!

来源:https://www.cnblogs.com/wy697495/archive/2018/09/12/9631909.html

标签:java,Class.getMethods(),Class.getDeclaredMethods()
0
投稿

猜你喜欢

  • Windows10系统下JDK1.8的下载安装及环境变量配置的教程

    2022-03-18 18:14:03
  • iOS实现微信朋友圈与摇一摇功能

    2023-06-16 13:59:48
  • Java二分查找算法实例详解

    2022-07-09 14:33:55
  • java比较器Comparable接口与Comaprator接口的深入分析

    2022-01-20 11:51:09
  • Flutter网络请求的3种简单实现方法

    2023-06-21 10:53:22
  • Kotlin之在Gradle中无参(no-arg)编译器插件的使用详解

    2023-07-31 19:11:43
  • 浅谈MyBatis 事务管理

    2022-03-22 16:17:11
  • Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.Transformer异常

    2022-07-03 11:12:34
  • java实现简单的猜数字小游戏

    2023-11-11 12:55:40
  • idea创建SpringBoot项目时Type选maven project和maven pom有何区别

    2023-07-04 07:20:27
  • java,android,MD5加密算法的实现代码(16位,32位)

    2022-07-12 20:40:10
  • SpringBoot集成mybatis实例

    2023-03-09 16:57:01
  • Java实现将每日新闻添加到自己博客中

    2023-02-08 16:20:43
  • Spark调优多线程并行处理任务实现方式

    2023-08-21 15:43:53
  • Java使用Apache.POI中HSSFWorkbook导出到Excel的实现方法

    2022-05-24 17:14:13
  • JavaSE static final及abstract修饰符实例解析

    2021-07-01 10:54:54
  • Java中反射动态 代理接口的详解及实例

    2023-11-28 05:29:36
  • VS2019配置opencv详细图文教程和测试代码的实现

    2023-07-17 13:49:31
  • java编程基础之模仿用户登录代码分享

    2022-06-09 17:38:22
  • VMware虚拟机下hadoop1.x的安装方法

    2023-07-27 08:01:40
  • asp之家 软件编程 m.aspxhome.com