在java中,可以根據Class類的對象,知道某個類(介面)的一些屬性(成員 ,方法,註釋,註解)等。由於最近的工作中用到了這些,其中需要在代碼中格局反射知道某些類的方法,查看文檔的時候,看到了getMethods()和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()等等,不同之處和上面基本一樣。
註意:本文僅代表個人理解和看法喲!和本人所在公司和團體無任何關係!