讀古今文學網 > 編寫高質量代碼:改善Java程序的151個建議 > 建議102:適時選擇getDeclared×××和get××× >

建議102:適時選擇getDeclared×××和get×××

Java的Class類提供了很多的getDeclared×××方法和get×××方法,例如getDeclared-Method和getMethod成對出現,getDeclaredConstructors和getConstructors也是成對出現,那這兩者之間有什麼差別呢?看如下代碼:


public static void main(Stringargs)throws Exception{

//方法名稱

String methodName="doStuff";

Method m1=Foo.class.getDeclaredMethod(methodName);

Method m2=Foo.class.getMethod(methodName);

}

//靜態內部類

static class Foo{

void doStuff(){}

}


此段代碼運行後的輸出如下:


Exception in thread"main"java.lang.NoSuchMethodException:Client$Foo.doStuff()

at java.lang.Class.getMethod(Class.java:1605)

at Client.main(Client.java:10)


該異常是說m2變量的getDeclaredMethod方法沒有找到doStuff方法,明明有這個方法呀,為什麼沒有找到呢?這是因為getMethod方法獲得的是所有public訪問級別的方法,包括從父類繼承的方法,而getDeclaredMethod獲得是自身類的所有方法,包括公用(public)方法、私有(private)方法等,而且不受限於訪問權限。

其他的getDeclaredConstructors和getConstructors、getDeclaredFields和getFields等與此相似。Java之所以如此處理,是因為反射本意只是正常代碼邏輯的一種補充,而不是讓正常代碼邏輯產生翻天覆地的變動,所以public的屬性和方法最容易獲取,私有屬性和方法也可以獲取,但要限定本類。

那現在問題來了:如果需要列出所有繼承自父類的方法,該如何實現呢?簡單,先獲得父類,然後使用getDeclaredMethods,之後持續遞歸即可。