zoukankan      html  css  js  c++  java
  • 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()等等,不同之处和上面基本一样。

    注意:本文仅代表个人理解和看法哟!和本人所在公司和团体无任何关系!

  • 相关阅读:
    解决pyinstaller 打包后运行exe程序出现的"ModuleNotFindError"
    【Tensorflow专题-03】深层神经网络
    【Tensorflow专题-02】使用tensorflow训练神经网络
    【Tensorflow专题-01】深度学习应用介绍及tensorflow基本使用
    Github 简明教程
    Composer 安装与使用
    为jQuery的$.ajax设置超时时间
    thinkphp 数据库表多字段排序
    TP5如何隐藏入口文件index.php
    Atom编辑器快捷键大全
  • 原文地址:https://www.cnblogs.com/wy697495/p/9631909.html
Copyright © 2011-2022 走看看