2014-05-22 7 views
5

Von How do I find the caller of a method using stacktrace or reflection?sun.reflect.Reflection.getCallerClass alternative

Da sun.reflect.Reflection.getCallerClass in jdk8, wurde entfernt, sein ein Was (wie ich nicht genug Ruf kommentieren dort selbst hatte) konnte Alternative?

Wie wäre es mit sun.misc.SharedSecrets

JavaLangAccess access = SharedSecrets.getJavaLangAccess(); 
    Throwable throwable = new Throwable(); 
    int depth = access.getStackTraceDepth(throwable); 
    StackTraceElement frame = access.getStackTraceElement(throwable, depth); 
+0

Versuchen Sie http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#getStackTrace() (beachten Sie, dass 'Thread.getStackTrace' zurückgegeben wird und die aktuelle Methode als Die ersten 2 Stack-Elemente) – DankMemes

+0

Wenn das aufgerufen wird, wird der gesamte Stack-Trace erstellt, was sehr ineffizient ist. Ich möchte nur in bestimmten Tiefen auf den Rahmen zugreifen. Eigentlich, die Alternative, die ich vorgeschlagen habe, wird wahrscheinlich auch die vollständige Stack-Trace erstellen. Ich bin nicht sicher. –

+1

Ich würde sagen, vermeiden Sie 'sun. *' Pakete, weil sie nicht auf allen Plattformen und Java-Konfigurationen da sein werden. Warum sollte der gesamte Stack-Trace ineffizient sein? Haben Sie viele Dinge im Stapel oder benötigen Sie diese mit hoher Geschwindigkeit? Mach dir keine Sorgen über die Effizienz, es sei denn, es macht einen Unterschied – DankMemes

Antwort

1

Wie oben in den Kommentaren diskutiert. Ich kam zu dem Schluss, SharedSecrets.getJavaLangAccess() wie oben kurz erläutert zu verwenden, aber die Abhängigkeit vom sun. * -Paket ganz als langfristige Lösung zu entfernen.

Grundsätzlich ändere ich meine Anforderung selbst, so dass es keine getCallerClass-Funktionalität erfordert.