2016-06-17 10 views
6

Varsayılan eşitleme yöntemine sahip sınıfların farklı meta nesnesi Metodları farklı örnekleri olduğunu keşfettim. Neden böyle? İlk bakışta, optimal değil çünkü metod nesneleri değişmez.Neden birden çok Yöntem nesnesinin miras alınan yöntemler için mi olduğu

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

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

Herhangi bir teorik sebep olduğunu düşünmüyorum, muhtemelen fiyatında pratikte çok fazla gelişme sağlayacak bir optimizasyon değildir. – biziclop

+0

Her iki dizeyi de, farklı sınıflara aitse, dize temsili farklı olmalı. –

+0

Metod nesnelerinin değişmez olması, optimal olmayan ile ne yapmak zorundadır? – EJP

cevap

5

Maalesef Method nesneler değil değişken değildir. Java 2, Method, setAccessible(boolean) yöntemine sahip AccessibleObject yöntemini genişletir.

Bu nedenle, yöntemlerin değiştirilebilir bir özelliği olmadığından, bu bayrak, Method nesnelerinin paylaşımına izin vermeyen güvenlik etkilerine sahiptir. Kaputun altında, Method nesneler bir temsilci nesnesi yoluyla ortak değişmez durumu paylaşmak anlamına

Not peki Class.getMethod aldığım sadece bu değişken bayrak oluşan ucuz bir ön uç nesne ve paylaşılan kanonik yönteme bir referanstır temsilidir.

0

Nesne yöntemine eşittir, son değil, X sınıfınız tarafından yeniden oluşturulmuş olması gerekir.

+2

Bu soruya gerçekten cevap vermiyor. – biziclop

+0

ne demek istiyorsun? Neden bunların iki farklı eşittir yöntemi olduğunu soruyor. X sınıfının eşitliği yeniden yapması gerektiğini söylüyorum. Bunun mümkün olmadığını söylüyor çünkü tüm Object yöntemi değişmez. Doğru olmadığını söylüyorum, çünkü eşittirler nihai işaretleyici değildir. – sab

+2

İki sınıf için iki farklı "Yöntem" nesnesinin neden olduğunu sorar: * iki farklı 'eşittir() yöntemi yoktur. Ve o, ** 'Nesne' nin tüm yöntemlerinin değişmez olduğunu söylemiyor. Soruyu okuyun. – EJP

2

Aşağıdaki kod baskılar hatta aynı sınıfta aynıMethod karşılık gelen iki Method nesneler için false:

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

iki yöntemlere atıfta Method nesneler için tekil davranış beklemek nedenle boşta farklı sınıfları.

İlgili konular