java中Class.getMethods()和Class.getDeclaredMethods()方法的区别
在java中,可以根据Class类的对象,知道某个类(接口)的一些属性(成员,方法,注释,注解)等。由于最近的工作中用到了这些,其中需要在代码中格局反射知道某些类的方法,查看文档的时候,看到了getMethods()和getDeclaredMethods()的差异。虽然两者都能实现目的,但个人觉得还是有必要区分下。
JDKAPI(1.6)文档中是这样翻译两个方法的:
getMethods():
返回一个包含某些Method对象的数组,这些对象反映此Class对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共member方法。数组类返回从Object类继承的所有(公共)member方法。返回数组中的元素没有排序,也没有任何特定的顺序。如果此Class对象表示没有公共成员方法的类或接口,或者表示一个基本类型或void,则此方法返回长度为0的数组。类初始化方法
getDeclaredMethods():
返回Method对象的一个数组,这些对象反映此Class对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何方法,或者此Class对象表示一个基本类型、一个数组类或void,则此方法返回一个长度为0的数组。类初始化方法
大致上来看,两个方法的区别主要在于:getMethods()返回的是该类以及超类的公共方法。getDeclaredMethods()返回该类本身自己声明的包括公共、保护、默认(包)访问和私有方法,但并不包括超类中的方法。比如如下列子:
publicclassTestObject { privatevoidmethod1() { } publicvoidmethod2() { } voidmethod3() { } protectedvoidmethod4() { } } publicclassTestClass { publicstaticvoidmain(String[]args) { Method[]methods=TestObject.class.getMethods(); System.out.println("getMethods():"); for(Methodmethod:methods) { System.out.println(method.getName()); } Method[]methods2=TestObject.class.getDeclaredMethods(); System.out.println("==========================="); System.out.println("getDeclaredMethods():"); for(Methodmethod: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按照文档上介绍的一样。比如”空”接口,基本类型:
publicinterfaceTestInterface { } //两种方法返回的都是空
以及基本类型:两种方法返回的也都是空
Method[]methods=int.class.getMethods(); Method[]methods2=int.class.getDeclaredMethods();
总结:其实Class中有很多相似的方法比如:getAnnotations()和getDeclaredAnnotations(),以及getFields()和getDeclaredFields()等等,不同之处和上面基本一样
总结
以上所述是小编给大家介绍的java中Class.getMethods()和Class.getDeclaredMethods()方法的区别,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!