2016-06-17 4 views
6

デフォルトのequalsメソッドを持つクラスが異なる メタオブジェクトメソッドのインスタンスを検出しました。それはなぜそうですか? 一見すると、メソッドオブジェクトは不変なので、最適ではないように見えます。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以来、メソッドを持つAccessibleObjectを、Methodが拡張しています。

メソッドには変更可能なプロパティがあるだけでなく、Methodオブジェクトの共有を許可しないセキュリティ上の影響があります。ボンネットの下に、Methodオブジェクトは、デリゲートオブジェクトを経由して、共通の不変状態を共有するので、何をClass.getMethodから取得すると、その変更可能なフラグからなるだけ安いフロントエンドオブジェクトであり、共有正規の方法を参照するかということ

注意表現。

0

オブジェクトの等価メソッドは最終的ではありません。あなたのXクラスによって再実装されているはずです。

+2

これは本当に質問に答えません。 – biziclop

+0

どういう意味ですか? 彼はなぜ彼らの2つの違いがメソッドに等しいのか尋ねます。 クラスXは、equalsを再実装する必要があります。 彼は、Objectのすべてのメソッドが不変であるため、これは不可能だと言います。 私は、それは真実ではない、そして等価は最終的なマーカーを持っていないと言う。 – sab

+2

彼はなぜ2つの異なる 'equals()'メソッドがない2つのクラスの2つの異なる 'Method'オブジェクトがあるのか​​質問します。そして、彼は** Object **のすべてのメソッドは不変であるとは言っていません。質問を読む。 – EJP

2

次のコードプリントfalseも同じクラスに同じMethodを参照する2つのMethodオブジェクトに対して:

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

2つのメソッドを参照Methodオブジェクトのシングルトン挙動を期待することがアイドル状態であります異なるクラス。

関連する問題