java中Class.getMethods()和Class.getDeclaredMethods()方法的區(qū)別
在java中,可以根據(jù)Class類(lèi)的對(duì)象,知道某個(gè)類(lèi)(接口)的一些屬性(成員 ,方法,注釋?zhuān)⒔猓┑?。由于最近的工作中用到了這些,其中需要在代碼中格局反射知道某些類(lèi)的方法,查看文檔的時(shí)候,看到了getMethods()和getDeclaredMethods()的差異。雖然兩者都能實(shí)現(xiàn)目的,但個(gè)人覺(jué)得還是有必要區(qū)分下。
JDK API(1.6)文檔中是這樣翻譯兩個(gè)方法的:
getMethods():
返回一個(gè)包含某些 Method 對(duì)象的數(shù)組,這些對(duì)象反映此 Class 對(duì)象所表示的類(lèi)或接口(包括那些由該類(lèi)或接口聲明的以及從超類(lèi)和超接口繼承的那些的類(lèi)或接口)的公共 member 方法。數(shù)組類(lèi)返回從 Object 類(lèi)繼承的所有(公共)member 方法。返回?cái)?shù)組中的元素沒(méi)有排序,也沒(méi)有任何特定的順序。如果此 Class 對(duì)象表示沒(méi)有公共成員方法的類(lèi)或接口,或者表示一個(gè)基本類(lèi)型或 void,則此方法返回長(zhǎng)度為 0 的數(shù)組。類(lèi)初始化方法 <clinit> 不包含在返回的數(shù)組中。如果類(lèi)聲明了帶有相同參數(shù)類(lèi)型的多個(gè)公共成員方法,則它們都會(huì)包含在返回的數(shù)組中。
getDeclaredMethods():
返回 Method 對(duì)象的一個(gè)數(shù)組,這些對(duì)象反映此 Class 對(duì)象表示的類(lèi)或接口聲明的所有方法,包括公共、保護(hù)、默認(rèn)(包)訪問(wèn)和私有方法,但不包括繼承的方法。返回?cái)?shù)組中的元素沒(méi)有排序,也沒(méi)有任何特定的順序。如果該類(lèi)或接口不聲明任何方法,或者此 Class 對(duì)象表示一個(gè)基本類(lèi)型、一個(gè)數(shù)組類(lèi)或 void,則此方法返回一個(gè)長(zhǎng)度為 0 的數(shù)組。類(lèi)初始化方法 <clinit> 不包含在返回?cái)?shù)組中。如果該類(lèi)聲明帶有相同參數(shù)類(lèi)型的多個(gè)公共成員方法,則它們都包含在返回的數(shù)組中。
大致上來(lái)看,兩個(gè)方法的區(qū)別主要在于:getMethods()返回的是該類(lèi)以及超類(lèi)的公共方法。getDeclaredMethods()返回該類(lèi)本身自己聲明的包括公共、保護(hù)、默認(rèn)(包)訪問(wèn)和私有方法,但并不包括超類(lèi)中的方法。比如如下列子:
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()); } } }
運(yùn)行TestClass結(jié)果:
getMethods():
method2
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
===========================
getDeclaredMethods():
method1
method2
method3
method4
很明顯getMethods()就返回一個(gè)自己聲明的method2()方法,其余的方法全部是來(lái)自O(shè)bject類(lèi)。getDeclaredMethods()
返回了自生聲明的四個(gè)方法。兩個(gè)方法的主要區(qū)別就在這里吧。
另外,返回Method數(shù)組為0 的情況也是JDK按照文檔上介紹的一樣。比如”空”接口,基本類(lèi)型:
public interface TestInterface { } //兩種方法返回的都是空
以及基本類(lèi)型:兩種方法返回的也都是空
Method[] methods = int.class.getMethods(); Method[] methods2 = int.class.getDeclaredMethods();
總結(jié):其實(shí)Class中有很多相似的方法比如:getAnnotations()
和getDeclaredAnnotations(),
以及getFields()和getDeclaredFields()等等,不同之處和上面基本一樣
總結(jié)
以上所述是小編給大家介紹的java中Class.getMethods()和Class.getDeclaredMethods()方法的區(qū)別,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Java中system.exit(0) 和 system.exit(1)區(qū)別
本文主要介紹了Java中system.exit(0) 和 system.exit(1)區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05SpringMVC中事務(wù)是否可以加在Controller層的問(wèn)題
這篇文章主要介紹了SpringMVC中事務(wù)是否可以加在Controller層的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02基于SpringBoot創(chuàng)建Web頁(yè)面并熱更新的操作步驟
SpringBoot是一個(gè)用于快速開(kāi)發(fā)單個(gè)微服務(wù)的框架,它基于 Spring 框架,簡(jiǎn)化了Spring應(yīng)用的初始化過(guò)程和開(kāi)發(fā)流程,本文給大家介紹了如何基于SpringBoot創(chuàng)建Web頁(yè)面并熱更新,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11關(guān)于SpringCloud的微服務(wù)以及組件詳解
這篇文章主要介紹了關(guān)于SpringCloud的微服務(wù)以及組件詳解,是一個(gè)更高層次的、 架構(gòu)視角的綜合性大型項(xiàng)目, 他的目標(biāo)是構(gòu)建一套標(biāo)準(zhǔn)化的微服務(wù)解決方案,需要的朋友可以參考下2023-05-05