Was ist die neue Methode, um alle Methoden einer Klasse abzurufen, einschließlich der geerbten Standardmethoden von Java 8?
Ich möchte alle Methoden einer Klasse abrufen, einschließlich öffentlicher, geschützter, paketierter und privater Methoden sowie geerbter Methoden.
Merken
Class.getDeclaredMethods()
wird öffentlich, geschützt, paketiert und privat,abe schließt geerbte Methoden aus.Class.getMethods
erhält geerbte Methoden,abe nur die öffentlichen.Vor Java 8 konnten wir etwas in der Art tun:
Collection<Method> found = new ArrayList<Method>();
while (clazz != null) {
for (Method m1 : clazz.getDeclaredMethods()) {
boolean overridden = false;
for (Method m2 : found) {
if (m2.getName().equals(m1.getName())
&& Arrays.deepEquals(m1.getParameterTypes(), m2
.getParameterTypes())) {
overridden = true;
break;
}
}
if (!overridden) found.add(m1);
}
clazz = clazz.getSuperclass();
}
return found;
Aber jetzt, wenn die Klasse eine Schnittstelle mit @ implementiedefault methods, die nicht von konkreten Oberklassen überschrieben werden, entziehen sich diese Methoden der obigen Erkennung. Außerdem gibt es jetzt Regeln für gleichnamige Standardmethoden, die ebenfalls berücksichtigt werden müssen.
Frage Was ist der derzeit empfohlene Weg, um an @ zu kommeall Methoden einer Klasse:
Die gebräuchlichste Definition von "all" sollten die Methoden sein, auf die direkt innerhalb einer Instanzmethode der Klasse zugegriffen werden kann, ohne die Verwendung vonsuper
oder Klassennamen:
So passt die obige Definition zur folgenden Signatur, wenn beide Booleschen Flags @ sifalse
:
public Collection<Method> getAllMethods(Class clazz,
boolean includeAllPackageAndPrivateMethodsOfSuperclasses,
boolean includeOverridenAndHidden)
Die ideale kanonische Antwort sollte diese booleschen Flags berücksichtigen.