Wie 'teuer' ist die Verwendung des Stack Trace ?

Status
Nicht offen für weitere Antworten.

Xerxis13

Mitglied
Hallo zusammen,

ich habe versucht, einen eleganten Weg zu finden, heraus zu bekommen, 'von wem ich aufgerufen wurde'..Ich bin in einer Methode und möchte wissen, von wo sie aufgerufen wurde(Welche Klasse, welche Methode).

Bisschen im Netz gesucht und ausprobiert, bin ich auf die Lösung StackTrace gekommen:
Java:
Throwable t = new Throwable();
  StackTraceElement[] stacktrace = t.getStackTrace();
Das Array kann man halt durchlaufen, '0' ist die aktuelle Methode, '1' der Aufrufer.

Nun die Frage:
'Kostet' das was?

Also weiß wer, ob die getStackTrace() Methode 'aufwendige' Schritte durchlaufen muss oder sonst wie viel kostet ?

Gibt es andere elegante Varianten an die benötigten Informationen(Wer ruft mich auf) zu kommen, ohne eine Referenz zu übergeben?

Vielleicht hat ja schon wer Erfahrung mit diesem Konstrukt.


Weiß auch wer, wie sich diese Methode im Bezug auf Threads verhält?
Ist zwar jetzt etwas OT, aber die Frage schießt mir gerade so in den Kopf. Ist in einem Multithread System diese Art der Lösung noch praktikabel ?


MFG
Patrick
 
Zuletzt bearbeitet:
Ich bin in einer Methode und möchte wissen, von wo sie aufgerufen wurde(Welche Klasse, welche Methode).
Wozu? Der Bedarf nach so einer Funktionalität deutet auf ein sehr spezielles Tool hin (eher selten) oder einen Designfehler (eher häufig).

In der Regel wird das Generieren eines Callstacks (z.B. für eine Exception) als teuer betrachtet.
 
Nun, in meinem Fall geht es darum, das ich aus einer extern liegenden Bibliothek heraus an Ressourcen parallel liegend zum Aufrufer ran möchte.


Ich frage hier, weil ich auch im Hinterkopf habe, das Exceptions 'teuer' sind, weil sie auf den StackTrace zurück greifen.


Aber so rein logisch betrachtet, ist der StackTrace doch immer vorhanden, oder?
Er wird ja mit jeder Aktion die ich triegere gepfelgt und nicht erst erstellt, wenn er gebraucht wird(bis dahin könnte er ja den verlauf garnicht mehr wiederherstellen).

Heißt, ich greife doch auf eine 'Datenquelle' zu, die doch vom System die ganze Zeit vorgehalten wird, oder?

Ich frage hier halt, weil wie gesagt, ich auch im Hinterkopf habe, das es teuer sei, finde aber nach näherer Betrachtung keinen Grund dafür.

Ich hoffe ihr könnt mir helfen da ein bisschen Licht ins Dunkel der Vorurteile zu bringen 🙂
 
@habi55:
Es gibt durchaus Situationen, welche das erfordern. Z.B. ein eigener SecurityManager kann so was benötigen...
 
Wäre es nicht evtl. einfacher die Resourcen mit zu übergeben?

Einfacher wäre es sicherlich, aber zum einen nicht immer möglich zum anderen geht es mir aber auch um die Möglichkeit das Problem anders zu lösen/lösen zu können.

Die Frage ist halt, ob der StackTrace auch im Normalfeld nutzbar ist oder ich da ein Tabu-Thema der 'guten Programmierung' anfasse...
 
Benutz wenigstens
Code:
Thread.currentThread().getStackTrace()
anstelle der Exception.

Kosten: wenn du die Operation 10'000 mal pro Sekunde ausführen musst, könntest du allenfalls Probleme kriegen, vermutlich benötigst du die Operation allerdings nicht derart oft?

Was das Design angeht haben meine Vorredner wohl schon alles gesagt.
 
Du kannst das auch ohne Stacktrace lösen, und zwar mittels AOP. Du kannst z.B. mit AspectJ einen Aspekt schreiben und dann mittels Bytecode Instrumentation Deinen Code an den enstprechenden Stellen um den Aspekt erweitern. Über den JoinPoint kommst Du dabei an das aufrufende Objekt ran.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben