java中Class.getMethods()和Class.getDeclaredMethods()方法的區(qū)別
在java中,可以根據(jù)Class類的對象,知道某個類(接口)的一些屬性(成員 ,方法,注釋,注解)等。由于最近的工作中用到了這些,其中需要在代碼中格局反射知道某些類的方法,查看文檔的時候,看到了getMethods()和getDeclaredMethods()的差異。雖然兩者都能實現(xiàn)目的,但個人覺得還是有必要區(qū)分下。
JDK API(1.6)文檔中是這樣翻譯兩個方法的:
getMethods():
返回一個包含某些 Method 對象的數(shù)組,這些對象反映此 Class 對象所表示的類或接口(包括那些由該類或接口聲明的以及從超類和超接口繼承的那些的類或接口)的公共 member 方法。數(shù)組類返回從 Object 類繼承的所有(公共)member 方法。返回數(shù)組中的元素沒有排序,也沒有任何特定的順序。如果此 Class 對象表示沒有公共成員方法的類或接口,或者表示一個基本類型或 void,則此方法返回長度為 0 的數(shù)組。類初始化方法 <clinit> 不包含在返回的數(shù)組中。如果類聲明了帶有相同參數(shù)類型的多個公共成員方法,則它們都會包含在返回的數(shù)組中。
getDeclaredMethods():
返回 Method 對象的一個數(shù)組,這些對象反映此 Class 對象表示的類或接口聲明的所有方法,包括公共、保護(hù)、默認(rèn)(包)訪問和私有方法,但不包括繼承的方法。返回數(shù)組中的元素沒有排序,也沒有任何特定的順序。如果該類或接口不聲明任何方法,或者此 Class 對象表示一個基本類型、一個數(shù)組類或 void,則此方法返回一個長度為 0 的數(shù)組。類初始化方法 <clinit> 不包含在返回數(shù)組中。如果該類聲明帶有相同參數(shù)類型的多個公共成員方法,則它們都包含在返回的數(shù)組中。
大致上來看,兩個方法的區(qū)別主要在于:getMethods()返回的是該類以及超類的公共方法。getDeclaredMethods()返回該類本身自己聲明的包括公共、保護(hù)、默認(rèn)(包)訪問和私有方法,但并不包括超類中的方法。比如如下列子:
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()就返回一個自己聲明的method2()方法,其余的方法全部是來自O(shè)bject類。getDeclaredMethods()返回了自生聲明的四個方法。兩個方法的主要區(qū)別就在這里吧。
另外,返回Method數(shù)組為0 的情況也是JDK按照文檔上介紹的一樣。比如”空”接口,基本類型:
public interface TestInterface
{
}
//兩種方法返回的都是空
以及基本類型:兩種方法返回的也都是空
Method[] methods = int.class.getMethods(); Method[] methods2 = int.class.getDeclaredMethods();
總結(jié):其實Class中有很多相似的方法比如:getAnnotations()和getDeclaredAnnotations(),以及getFields()和getDeclaredFields()等等,不同之處和上面基本一樣
總結(jié)
以上所述是小編給大家介紹的java中Class.getMethods()和Class.getDeclaredMethods()方法的區(qū)別,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
elasticsearch數(shù)據(jù)信息索引操作action?support示例分析
這篇文章主要為大家介紹了elasticsearch數(shù)據(jù)信息索引操作action?support示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
詳解Java的Hibernate框架中的Interceptor和Collection
這篇文章主要介紹了Java的Hibernate框架中的Interceptor和Collection,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2016-01-01
IntelliJ IDEA 編輯器的全局搜索中使用正則表達(dá)式的操作方法
這篇文章主要介紹了IntelliJ IDEA 編輯器的全局搜索中使用正則表達(dá)式的相關(guān)知識,補(bǔ)充介紹了IDEA查找和替換實用正則,感興趣的朋友跟隨小編一起看看吧2024-01-01
詳解SpringBoot 發(fā)布ApplicationEventPublisher和監(jiān)聽ApplicationEvent事
這篇文章主要介紹了詳解SpringBoot 發(fā)布ApplicationEventPublisher和監(jiān)聽ApplicationEvent事件,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-06-06
Java中關(guān)于Collections集合工具類的詳細(xì)介紹
Java提供了一個操作Set、List和Map等集合的工具類:Collections,該工具提供了大量方法對集合元素進(jìn)行排序、查詢和修改等操作,還提供了將集合對象設(shè)置為不可變、對集合對象實現(xiàn)同步控制等方法2021-09-09

