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()等等,不同之处和上面基本一样。

 

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

posted @ 2018-09-12 00:47  freeTimeWY  阅读(2179)  评论(0编辑  收藏  举报