2016-06-17 10 views
6

Ich entdeckte, dass Klassen mit Standard-Equals-Methode verschiedene Instanzen von Meta-Objekt-Methode hat. Wieso ist es so? Auf den ersten Blick sieht es nicht optimal aus, da Methodenobjekte unveränderlich sind.Warum mehrere Instanzen von Method-Objekt für die vererbten Methoden sind

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

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

Ich glaube nicht, dass es einen theoretischen Grund gibt, es ist wahrscheinlich einfach keine Optimierung, die in der Praxis für ihren Preis viel Verbesserung bringen würde. – biziclop

+0

Versuchen Sie, beide in eine Zeichenfolge zu konvertieren. Wenn sie zu verschiedenen Klassen gehören, sollte ihre Zeichenfolgendarstellung unterschiedlich sein. –

+0

Was bedeutet, dass unveränderliche Methodenobjekte nicht optimal sind? – EJP

Antwort

5

Leider sind Method Objekte nicht unveränderlich. Seit Java 2, Method erstreckt sich AccessibleObject, die die setAccessible(boolean) Methode hat.

So haben Methoden nicht nur eine veränderbare Eigenschaft, dieses Flag hat Sicherheitsauswirkungen, die die gemeinsame Nutzung von Method Objekten verbieten.

Beachten Sie, dass unter der Haube, Method Objekte über einen Delegatobjekt ihren gemeinsamen unveränderlichen Staat teilen, so was Sie von Class.getMethod bekommen, ist nur ein billiges Front-End-Objekt aus dieser wandelbar Flagge und ein Verweis auf das gemeinsame kanonische Verfahren Darstellung.

0

Gleichwertige Methode des Objekts ist nicht endgültig, es sollte von Ihrer X-Klasse neu implementiert worden sein.

+2

Das beantwortet die Frage nicht wirklich. – biziclop

+0

was meinst du? Er fragt, warum ihre zwei differents gleich Methode ist. Ich sage, dass die Klasse X die Gleichen neu implementiert haben sollte. Er sagt, das ist nicht möglich, weil alle Methoden von Object unveränderlich sind. Ich sage, dass es nicht wahr ist, und weil Gleichgestellte nicht den letzten Marker haben. – sab

+2

Er fragt, warum es zwei verschiedene "Method" -Objekte für zwei Klassen gibt, bei denen es * nicht * zwei verschiedene 'equals()' -Methoden gibt. Und er sagt nicht, dass alle Methoden von "Objekt" unveränderlich sind. Lies die Frage. – EJP

2

Der folgende Code druckt false sogar für zwei Method Objekte, die die gleicheMethod in der gleichen Klasse verweisen:

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

Es ist daher müßig Singleton Verhalten für Method Objekte zu erwarten Bezug auf Methoden in zwei verschiedene Klassen.