2016-06-17 73 views
6

我發現具有默認equals方法的類具有不同的 元對象Method的實例。爲什麼這樣? 乍一看,它看起來並不理想,因爲方法對象是不可變的。爲什麼Method對象的多個實例是用於繼承的方法的

class X {} 
Method defaultM = Object.class.getMethod("equals", Object.class) 
Method xMethod = X.class.getMethod("equals", Object.class) 

xMethod != defaultM 
xMethod.equals(defaultM) 
+0

我不認爲有任何理論上的原因,它可能只是不是一個優化,它會在價格實踐上帶來很多改進。 – biziclop

+0

嘗試將兩者都轉換爲字符串,如果它們屬於不同的類,則它們的字符串表示形式應該不同。 –

+0

Method對象是不可變的,它與非最優有什麼關係? – EJP

回答

5

不幸的是,Method對象是而不是不可變。由於Java 2的Method擴展了AccessibleObject,它有setAccessible(boolean)方法。

因此,方法不僅具有可變屬性,該標誌具有不允許共享Method對象的安全影響。

需要注意的是引擎蓋下,Method對象並通過委託對象分享他們的共同不變的狀態,讓你從Class.getMethod得到的僅僅是由該可變標誌的廉價前端對象和對共享的規範方法的引用表示。

0

對象的等價方法不是最終的,它應該已經被X類重新實現。

+2

這並沒有真正回答這個問題。 – biziclop

+0

你是什麼意思? 他問爲什麼他們是兩種不同的方法。 我說X類應該重新實現了等號。 他說這是不可能的,因爲Object的所有方法都是不可變的。 我說這不是真的,因爲等於沒有最後的標記。 – sab

+2

他問爲什麼有兩個不同的'Method'對象有兩個類,其中有* *兩個不同的'equals()'方法。他並沒有**說「對象」的所有方法都是不可變的。閱讀問題。 – EJP

2

下面的代碼打印false即使對於參考相同Method在同一個類中的兩個Method對象:

Method m1 = A.class.getMethod("equals", Object.class); 
Method m2 = A.class.getMethod("equals", Object.class); 
System.out.println(m1 == m2); 

因此閒置期待Method對象引用的方法有兩種單行爲不同類。

相關問題