Gibt es eine Möglichkeit, den Namen der aktuell ausgeführten Methode in Java abzurufen?
java
reflection
methods
Omar Kooheji
quelle
quelle
Technisch wird das funktionieren ...
Während der Kompilierungszeit wird jedoch eine neue anonyme innere Klasse erstellt (z
YourClass$1.class
. B. ). Das schafft also eine.class
für jede Methode, die diesen Trick ausführt Datei erstellt. Zusätzlich wird bei jedem Aufruf zur Laufzeit eine ansonsten nicht verwendete Objektinstanz erstellt. Dies mag also ein akzeptabler Debug-Trick sein, bringt jedoch einen erheblichen Overhead mit sich.Ein Vorteil dieses Tricks ist die
getEncosingMethod()
Rückgabe, mitjava.lang.reflect.Method
der alle anderen Informationen der Methode einschließlich Anmerkungen und Parameternamen abgerufen werden können. Dies ermöglicht die Unterscheidung zwischen gleichnamigen Methoden (Methodenüberladung).Beachten Sie, dass laut JavaDoc
getEnclosingMethod()
dieser Trick kein a werfen sollteSecurityException
da innere Klassen mit demselben Klassenlader geladen werden sollten. Daher müssen die Zugriffsbedingungen auch dann nicht überprüft werden, wenn ein Sicherheitsmanager vorhanden ist.Es ist
getEnclosingConstructor()
für Konstruktoren erforderlich . Gibt bei Blöcken außerhalb von (benannten) MethodengetEnclosingMethod()
zurücknull
.quelle
getEnclosingMethod
Ruft den Namen der Methode ab, in der die Klasse definiert ist.this.getClass()
wird dir überhaupt nicht helfen. @wutzebaer warum brauchst du das überhaupt? Sie haben bereits Zugriff darauf.Januar 2009:
Ein vollständiger Code wäre (unter Berücksichtigung der Einschränkung von @ Bombe ):
Mehr in dieser Frage .
Update Dezember 2011:
bläuliche Kommentare:
virgo47 ‚s Antwort (upvoted) berechnet tatsächlich den richtigen Index anzuwenden , um den Namen der Methode zurück zu bekommen.
quelle
StackTraceElement
Array zum Debuggen zu drucken und festzustellen , ob 'main' tatsächlich die richtige Methode ist?ste[2 + depth].getMethodName()
. 0 istgetStackTrace()
, 1 istgetMethodName(int depth)
und 2 ruft die Methode auf. Siehe auch die Antwort von @ virgo47 .Wir haben diesen Code verwendet, um die potenzielle Variabilität des Stack-Trace-Index zu verringern. Rufen Sie jetzt einfach methodName util auf:
Scheint überentwickelt, aber wir hatten eine feste Nummer für JDK 1.5 und waren etwas überrascht, dass sie sich geändert hat, als wir zu JDK 1.6 gewechselt sind. Jetzt ist es in Java 6/7 dasselbe, aber man weiß es einfach nie. Es ist kein Beweis für Änderungen in diesem Index zur Laufzeit - aber hoffentlich macht HotSpot das nicht schlecht. :-)
quelle
Name hat den Wert foo.
quelle
null
Beide Optionen funktionieren für mich mit Java:
Oder:
quelle
Der schnellste Weg, den ich gefunden habe, ist folgender:
Es greift direkt auf die native Methode getStackTraceElement (int depth) zu. Und speichert die zugängliche Methode in einer statischen Variablen.
quelle
new Throwable().getStackTrace()
5614 ms dauerte.Verwenden Sie den folgenden Code:
quelle
quelle
Dies ist eine Erweiterung der Antwort von virgo47 (oben).
Es bietet einige statische Methoden, um die aktuellen und aufrufenden Klassen- / Methodennamen abzurufen.
quelle
Um den Namen der Methode zu erhalten, die die aktuelle Methode aufgerufen hat, können Sie Folgendes verwenden:
Dies funktioniert sowohl auf meinem MacBook als auch auf meinem Android-Handy
Ich habe auch versucht:
aber Android wird "getStackTrace" zurückgeben. Ich könnte dies für Android mit beheben
aber dann bekomme ich auf meinem MacBook die falsche Antwort
quelle
getStackTrace()[0]
als zu verwendengetStackTrace()[1]
. YMMV.Thread.currentThread().getStackTrace()[2]
Util.java:
SomeClass.java:
quelle
final StackTraceElement e = Thread.currentThread().getStackTrace()[2];
arbeitet; Geben Siee.getClassName();
den vollständigen Klassennamen unde.getMethodName()
den Methonnamen zurück.getStackTrace()[2]
ist falsch, es muss sein,getStackTrace()[3]
weil: [0] dalvik.system.VMStack.getThreadStackTrace [1] java.lang.Thread.getStackTrace [2] Utils.getCurrentClassAndMethodNames [3] Die Funktion a (), die diese aufruftDies kann
StackWalker
seit Java 9 erfolgen.StackWalker
ist so konzipiert, dass es faul ist, daher ist es wahrscheinlich effizienter als beispielsweiseThread.getStackTrace
ein Array für den gesamten Callstack. Weitere Informationen finden Sie auch im JEP.quelle
Eine alternative Methode besteht darin, eine Ausnahme zu erstellen, aber nicht auszulösen und das Objekt zu verwenden, von dem die Stack-Trace-Daten abgerufen werden, da die einschließende Methode dies normalerweise tut den Index 0 hat - solange die JVM diese Informationen speichert, wie andere oben erwähnt. Dies ist jedoch nicht die billigste Methode.
Von Throwable.getStackTrace () (dies ist mindestens seit Java 5 dasselbe):
Das folgende Snippet geht davon aus, dass die Klasse nicht statisch ist (aufgrund von getClass ()), aber das ist eine Seite.
quelle
quelle
Ich habe eine Lösung mit diesem (In Android)
quelle
Ich weiß nicht, was die Absicht ist, den Namen der aktuell ausgeführten Methode zu erhalten, aber wenn dies nur zum Debuggen dient, können Protokollierungsframeworks wie "logback" hier helfen. Bei der Rückmeldung müssen Sie beispielsweise nur das Muster "% M" in Ihrer Protokollierungskonfiguration verwenden . Dies sollte jedoch mit Vorsicht angewendet werden, da dies die Leistung beeinträchtigen kann.
quelle
Nur für den Fall, dass die Methode, deren Namen Sie kennen möchten, eine Junit-Testmethode ist, können Sie die Junit-TestName-Regel verwenden: https://stackoverflow.com/a/1426730/3076107
quelle
Die meisten Antworten hier scheinen falsch zu sein.
Beispiel:
Ausgänge:
quelle
Ich habe die Antwort des Maklemenz ein wenig umgeschrieben :
quelle
quelle
getEnclosingMethod()
wirft einNullPointerException
für mich in Java 7.Was ist falsch an diesem Ansatz:
Und bevor die Leute verrückt nach der Verwendung werden
System.out.println(...)
, können und sollten Sie immer eine Methode erstellen, damit die Ausgabe umgeleitet werden kann, z.quelle