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:

Include public, protected, package und private Methoden, die in der Klasse selbst deklariert wurden.Include geschützte Methoden seiner Superklassen.Include Paketmethoden seiner Superklassen des gleichen Pakets.Include Standardmethoden seiner Schnittstellen (diejenigen nicht überschrieben / versteckt, sieheHie undHie).Statische Methoden (Klassen und Superklassen) mit entsprechender Barrierefreiheit einbeziehen. Private Methoden von Superklassen nicht einschließen. Überschriebene Methoden nicht einschließen. Schließen Sie keine versteckten Methoden ein (insbesondere keine versteckten statischen Methoden). Synthetische / Brücken-Methoden nicht einbeziehen. Fügen Sie keine von Java nicht zugelassenen Methoden ein, auch wenn die JVM dies zulässt.

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.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage