2016-07-15 19 views
0

Ich bin ein Fan von Debug-Logs (in Debug-Builds), und ich möchte einige Verbesserungen an meiner benutzerdefinierten Logger-Klasse vornehmen. Im Idealfall möchte ich eine Basismethode erstellen, die den Namen der aufrufenden Klasse, den Methodennamen und die Parameterwerte protokolliert.Automatische Anmeldung in Android

Zum Beispiel sagen, ich habe eine Anwendung "MyApplication" mit Klasse "MainActivity", und ich rufe Methode "foo" mit Parameter "bar". Ich möchte so etwas wie dies in der LogCat sehen:

D/MyApplication MainActivity foo("bar")

Gibt es eine Möglichkeit, diese Informationen zu bekommen, ohne manuell in alle diese Werte passieren zu müssen? Ich habe einige Artikel gesehen, die auf Java-unterstützte Methoden verweisen, wie java.lang.invoke.MethodHandles, aber ich habe keine gefunden, die sich auf von Android unterstützte Methoden beziehen. Ich erwarte, dass Parameter übergeben werden müssen, aber die Automatisierung des Klassennamens und des Methodennamens wäre ausgezeichnet.

Antwort

2

Aufruf Thread.currentThread().getStackTrace() können Sie die StackTraceElement des aktuellen Threads bekommen. Sie können dann getClassName(), getMethodName() und getLineNumber() anrufen, um die Klasse, Methode und Codezeile auszudrucken. Es würde ungefähr so ​​in Code aussehen.

StackTraceElement ste = Thread.currentThread().getStackTrace()[0]; 
String msg = ste.getClassName() + "." + ste.getMethodName() + ":" + ste.getLineNumber(); 
+0

Dank @ChrisStillwell, ich habe Antworten wie diese gesehen, und sollte es in meine Frage aufgenommen haben. Meine Frage dazu ist, was repräsentiert die [3]? Ich habe Antworten mit [0] und [1] gesehen, aber ich weiß nicht, welches Stack-Trace-Element zuverlässig ist. – lgdroid57

+0

Das '[3]' war, weil ich dieses aus einer Bibliothek kopiere, die ich in meinen Projekten verwenden kann. Im Grunde gibt 'getStackTrace()' ein Array von 'StackTraceElement' zurück. Der obere Teil des Arrays ist der oberste StackTrace (dh wo dieser aufgerufen wird). Wenn Sie die vollständige Ablaufverfolgung durch das Array durchlaufen möchten, erhalten Sie die gesamte Hierarchie der Aufrufe. Identisch mit dem Stacktrace, den Sie erhalten, wenn eine Ausnahme ausgelöst wird. – ChrisStillwell

+0

Wenn ich eine Exception in Zeile 15 in 'SomeMethod()' werfe, dann ist der Stacktrace, den ich dort sehe, identisch mit dem, den ich ausdrucken kann, wenn ich 'Thread.currentThread(). GetStackTrace()' an Zeile aufrufen würde 15 in 'SomeMethod()'. – ChrisStillwell