1. 程式人生 > >java中Class.getMethods()和Class.getDeclaredMethods()的區別

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():method2waitwaitwaitequalstoStringhashCodegetClassnotifynotifyAll===========================getDeclaredMethods():method1method2method3method4

  很明顯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()等等,不同之處和上面基本一樣。

注意:本文僅代表個人理解和看法喲!和本人所在公司和團體無任何關係!