Aus welcher Klasse wurde Methode aufgerufen

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo!

Wenn ich in Methode X einen Aufruf von Methode Y habe, gibt es eine Möglichkeit, wie in Y festgestellt werden kann, aus welcher Methode/Klasse dieser Aufruf stattfand?

Mit ist bewußt, daß in den Parametern this mitgegeben werden kann und mit getClass().getName() auf die Klasse zugegriffen werden kann, aber eben nur, wenn sie in den Paras übergeben wurde, oder?
Gibts da noch eine andere Möglichkeit?

Bin für jede Anregung dankbar.


Gruss,
Krabat
 
B

Beni

Gast
Du könntest eine Exception (new Exception() ) bauen, und dann den Stacktrace (Exception#getStackTrace()) abfragen.

Es gibt irgendwo noch eine elegantere Methode, aber ich weiss nicht mehr wo :?
 
R

Roar

Gast
hmm mit Java 5 ginge das so:
Code:
String name = Thread.currentThread().getStackTrace()[0].getMethodName();

was anderes fällt mir auch nicht ein...
 

Krabat

Bekanntes Mitglied
@Beni:
Wo könnte ich denn nach der eleganteren Methode anfangen zu suchen?

@Roar:
was ist Java 5? Java v1.5?
getStackTrace() kann er leider nicht finden beim return Wert von currentThread()...
 
R

Roar

Gast
ich hab mal gesucht, ich finde wirklich keine andere möglichkeit. nichmal in den management extensions.. oder ich bin einfach nur blind :autsch:
 

thE_29

Top Contributor
ich habe eine gefunden! Nur leider weiß ich sie nicht auswendig, hab sie aber in der Firma verwendet!

Hab ziemlich lange im Internet gesucht, poste es dann morgen!
 

Grizzly

Top Contributor
Mich würde interessieren, wofür Du das brauchst. Ich programmiere schon einige ziemlich lange Zeit, aber eine sinnvollen Einsatz fällt mir dazu nicht ein ???:L . Vielleicht kann man das Problem ja auch ganz anders lösen ;) .
 

meez

Top Contributor
Grizzly hat gesagt.:
Mich würde interessieren, wofür Du das brauchst. Ich programmiere schon einige ziemlich lange Zeit, aber eine sinnvollen Einsatz fällt mir dazu nicht ein ???:L . Vielleicht kann man das Problem ja auch ganz anders lösen ;) .

Frag ich mich auch...:bahnhof:
 

Krabat

Bekanntes Mitglied
ok, ich hoffe, das klingt jetzt nicht irgendwie hohl, aber ich habe ein log Fenster gebaut, an welches aktuelle Trace Meldungen geschickt werden. Das möchte ich zum debuggen und für info/status Meldungen nutzen und soll in einem seperaten Package bei jedem neuen Projekt das debuggen erleichtern.

Dann hatte mich (ich glaube es war) Roar im Chat darauf aufmerksam gemacht, daß es bereits sowas in der Art in java.util.loggin gibt. Dabei ich die letzten beiden Tage damit verbracht die Log Klasse zusammen mit dem Fenster und dem Table(Model/Renderer) zu implementieren. Daher möchte ich es gerne fertigstellen.

Da es ein wenig umständlich ist, wenn bei jeder Meldung die aktuelle Klasse+Methode mitgeschickt wird, es aber sinnig ist, diese Informationen zu sehen, dachte ich mir, man könne es vielleicht automatisieren.
 
G

Guest

Gast
So spontan fällt mir sowas ein.
Code:
  public static String invokedBy() {
    try {
      throw new Exception();
    }
    catch(Exception e) {
      try {
        StringWriter sw = new StringWriter();
        e.printStackTrace(new PrintWriter(sw));
        sw.flush();
        sw.close();
        LineNumberReader r = new LineNumberReader(new StringReader(sw.getBuffer().toString()));
        r.readLine();
        r.readLine();
        r.readLine();
        String method = r.readLine().trim();
        r.close();
        return method.substring(3, method.indexOf('('));
      }
      catch(IOException ioe) {
        return null;
      }
    }
  }
Einfach diese Methode aufrufen und das Ergebnis ist die Methode,
die die aktuelle aufgerufen hat.
 
R

Roar

Gast
ich hab oben schon den code gepostet der dazu nötig ist. ist wohl etwas kürzer und weniger umständlicher (erst in datei schreiben dann wieder auslesen?)

es geht darum eine weniger schmutzige methode zu haben
 

Grizzly

Top Contributor
Zum Loggen verwende ich bspw. das Jakarta Commons Logging. Das sieht dann im Code in etwa so aus (Hab' das aus einer meiner Quellcodes mal kurz rauskopiert):
Code:
public final class ColorTable {
	/** Das Logging-Objekt für diese Klasse. */
	private static Log log = LogFactory.getLog(ColorTable.class);
	
	/** Und so weiter und so fort. */
	
	/**
	 * Dies ist der Standard Konstruktor.
	 */
	private ColorTable() {
		super();
		final int maxColorNumber = 256;
		int red, green, blue;
		
		// Maximal: 32, Minimal: 4
		this.anzahl = maxColorNumber / colorDifference;
		
		log.debug("ColorTable()");
		log.trace("\tFarbabstand          = " + colorDifference);
		log.trace("\tFarbanzahl           = " + (this.anzahl + 1));
		log.trace("\tFarbanzahl insgesamt = " + ((this.anzahl + 1) * (this.anzahl + 1) * (this.anzahl + 1)));
		
		/** Und so weiter und so fort. */
		
	}
	
	/** Und so weiter und so fort. */
}
Und durch LogFactory.getLog(ColorTable.class); weiss bspw. der Logger von welcher Klasse die Infos stammen. Eine Ausgabe der Meldung in bspw. einer JTextArea wäre natürlich auch möglich. Wobei man Logging-Meldungen ja eher in die Konsole oder eine Log-Datei ausgibt.
 

Krabat

Bekanntes Mitglied
Hi!

Danke Euch vielmals für Eure Ideen!


Bin noch gespannt, ob thE_29 es anders gelöst hat ...
Gruss
Krabat
 

thE_29

Top Contributor
so, also hier ist meine Lösung


Code:
      Throwable t = new Throwable();
      StackTraceElement[] ste = t.getStackTrace();
//bei mir war es einmal in ste[1].getClassName(); und 1mal in ste[3].getClassName();
//kommt darauf wie verschachtelt die Klasse ist, es steht dann das gesamte Package.Klasse drinnen

So gings bei mir und dann muss man auch nix werfen und ich hab das auch fürs loggen und für eine Klasse die von verschiedene Klassen aber mit verschiedenen Parameteren gebraucht wird (Klassenabhängig)!

beim Logger hatte ich ste[1] und beim anderen ste[3].getClassName()

Musst du schauen!
 

Krabat

Bekanntes Mitglied
Roar hat gesagt.:
hmm mit Java 5 ginge das so:
Code:
String name = Thread.currentThread().getStackTrace()[0].getMethodName();
...



thE_29 hat gesagt.:
so, also hier ist meine Lösung
Code:
      Throwable t = new Throwable();
      StackTraceElement[] ste = t.getStackTrace();
//bei mir war es einmal in ste[1].getClassName(); und 1mal in ste[3].getClassName();
//kommt darauf wie verschachtelt die Klasse ist, es steht dann das gesamte Package.Klasse drinnen



Habe beide Lösungen ausprobiert und beide funktionieren super!
Frage mich nur noch, ob es einen größeren Unterschied zwischen diesen Möglichkeiten gibt?
Bei der Thread-Variante wird wahrscheinlich nur der aktuelle Thread betrachtet und wenn ich in meinem Programm keine neuen Threads anlege, handelt es sich wahrscheinlich nur um einen(?), wird also keine Probleme verursachen. Habe ich aber mehrere Threads, wird dann stets nur der eine, aktuelle Thread betrachtet? Müßte man dann pro Thread ein Log Objekt anlegen? (was schwierig wäre, wenn alle Ihre Ausgaben in dasselbe Fenster/Table schreiben sollen.

Wäre dann Throwable eine Lösung, um um die Thread-Grenzen hinweg das Logging zu aktivieren?
 

Illuvatar

Top Contributor
Das mit den Threads ist egal, es wird die aufrufende Methode ausgegeben, ist doch egal, welcher Thread die Methode aufruft.

Im Allgemeinen finde ich Roars Lösung besser, denn:
1. sie ist kürzer
2. die Klasse Throwable wird auch irgendwie über diese Methode gehen
3. die Klasse Throwable ist für andere Dinge gedacht, die Klasse Thread passt besser.
 

Krabat

Bekanntes Mitglied
Illuvatar hat gesagt.:
Das mit den Threads ist egal, es wird die aufrufende Methode ausgegeben, ist doch egal, welcher Thread die Methode aufruft.

hmm.... *grübel*
Wenn also Thread A mein Log aufruft. Mein Log läuft aber in Thread B, wird obwohl die Methode ...

Code:
ThreadB.currentThread()[x].getMethodName();

...in Thread B aufgerufen, trotzdem die aufrufende Methode in Thread A gefunden? Das wäre natürlich richtig fett!
:D



[edit] Formatierung ausgebessert.
 
B

bygones

Gast
mhm - ich glaub das versteh ich net so recht...
das mit dem loggen ist klar - wie rufst du denn in einem projekt denn den Logger auf ? warum kannst du nicht einfach in dem Aufruf des Loggers den Klassennamen / Methoden namen mitgeben ?
bzw. warum nicht einfach den SDK logger nehmen und als Handler ein Fenster nehmen ?!
 

Illuvatar

Top Contributor
Code:
public class ThreadTest
{
  private Logger l;
  public static void main (String[] args)
  {
     new ThreadTest();
  }
  public ThreadTest()
  {
      l = new Logger();
      new T1().start();
      new T2().start();
  }
  void runt1(){
    l.log();  //Ausgabe: runt1
  }
  void runt2(){
    l.log();  //Ausgabe: runt2
  }
  class T1 extends Thread
  {
    public void run()
    {
      runt1();
    }
  }
  class T2 extends Thread
  {
    public void run()
    {
      runt2();
    }
  }
  class Logger
  {
    public void log()
    {
      String name = Thread.currentThread().getStackTrace()[3].getMethodName();  //0: dumpThreads, 1: getStackTrace(), 2: log()
      System.out.println(name);
    }
  }
}

Edit: Vielleicht hast du das falsch verstanden:
currentThread() ist eine Klassenmethode von Thread, und gibt den Thread, der diese Methode aufruft, zurück, und der Thread hat eben den gesuchten Stacktrace.
 

thE_29

Top Contributor
oder du nimmst meine Methode, weil ein Thread is sicherlich auch nicht für das gedacht :)

SO ;)
 

Illuvatar

Top Contributor
Die Methode Thread#getStackTrace ist genau dafür gemacht, der Umweg über Exception ist von mir aus gerade noch ein Workaround vor 1.5. Ende der Diskussion. :D
 
R

Roar

Gast
deathbyaclown hat gesagt.:
bzw. warum nicht einfach den SDK logger nehmen und als Handler ein Fenster nehmen ?!

er hat halt schon angefangen das selbst zu schrieben und wills dann auch benutzen. kann ich auch verstehn...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
ruutaiokwu Welcher Browser unterstützt heutzutage noch Java Applets? Allgemeine Java-Themen 5
B Welcher Datentyp für sehr große Zahlenbereiche? Allgemeine Java-Themen 1
B Scanner erkennt keinen Text in Textdatei, obwohl welcher drinsteht Allgemeine Java-Themen 10
S Algorithmus welcher True-Werte in einem Array findet und auswertet. Allgemeine Java-Themen 5
O Java-Obfuscator, welcher einzelne Methoden, Klassen und Ordnerstrukturen ausnehmen kann. Allgemeine Java-Themen 1
S Welcher Schleifen type für eine Berechnung Allgemeine Java-Themen 7
M Erkennen, in welcher Methode sich die VM befindet Allgemeine Java-Themen 6
F Verschlüsseln, aber welcher Algo Allgemeine Java-Themen 29
L Entscheiden, welcher Code ausgeführt werden soll Allgemeine Java-Themen 7
O Thread beenden egal welcher Zustand? Allgemeine Java-Themen 8
S HTML => DOM - Welcher Parser für meine Zwecke? Allgemeine Java-Themen 3
J Drei Bedingungen -> 9 Fällen, welcher Ansatz besser Allgemeine Java-Themen 4
X Welcher Java Decompiler? JAD, JD-GUI?? Allgemeine Java-Themen 14
H2SO3- welcher writer kann fileencoding UND append? Allgemeine Java-Themen 2
G Reportgenerator: Welcher? Allgemeine Java-Themen 16
T Welcher Server? JSP und Client-Anwendung Allgemeine Java-Themen 4
G java als dienst, welcher auf tastatureingaben reagiert Allgemeine Java-Themen 6
G Auslesen mit welcher Java-Version Anwendung kompiliert wurde Allgemeine Java-Themen 2
B Java Buch zu welcher Version empfehlenswert? Allgemeine Java-Themen 6
V Neues Objekt anlegen, welcher Typ? Allgemeine Java-Themen 2
E In welcher Datei wird classpath gesetzt? Allgemeine Java-Themen 9
F Welcher Datentyp in welchen casten? Allgemeine Java-Themen 11
F Welcher Name? paintsXY(), isPaintXY(), isPaintingXY() . Allgemeine Java-Themen 4
D Debugging? an welcher Stelle? Allgemeine Java-Themen 3
G Ab welcher Dateigrösse lohnt Kompression? Allgemeine Java-Themen 2
G 2 Mäuse angeschlossen, aber von welcher kam der Klick? Allgemeine Java-Themen 5
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
Atten007 Java-Klasse auf macOS entpacken? Allgemeine Java-Themen 2
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
EinNickname9 Best Practice Singleton und Singleton mit Instanz zu anderer Klasse -Pattern Allgemeine Java-Themen 30
Y ImagePanel von anderer Klasse in eine MainFrame Klasse hinzufügen. Allgemeine Java-Themen 1
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
missy72 Klassen Eigene Klasse MessageWindow ähnlich der Alert Klasse Allgemeine Java-Themen 2
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
kanywayne Java programmieren: Polynom Klasse Allgemeine Java-Themen 4
L Die abzuleitende Klasse als Parameter übergeben Allgemeine Java-Themen 4
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
C Klasse mit Mockito simulieren Allgemeine Java-Themen 9
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
Thallius Key/Value Table in Klasse einlesen Allgemeine Java-Themen 14
S static in Interface und Klasse Allgemeine Java-Themen 2
W Was genau sind IOTools? Kann ich stattdessen nicht die Scanner Klasse verwenden? Allgemeine Java-Themen 3
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
D javassist API Klasse in MethodCall ermitteln Allgemeine Java-Themen 8
kodela Klasse mit "gezipten" Daten Allgemeine Java-Themen 6
J Builder Klasse mit Lombok bauen Allgemeine Java-Themen 2
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
M [SOAP] - Klasse aus WSDL ausschließen Allgemeine Java-Themen 2
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
X Klassen Klasse BreakIterator Allgemeine Java-Themen 6
R Arraylist in andere Klasse leiten und bearbeiten Allgemeine Java-Themen 10
kodela Klassen Klasse "vergisst" ihre Daten Allgemeine Java-Themen 2
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
E Socket Dynamische Klasse von ObjectOutputStream lesen. Allgemeine Java-Themen 8
M Matcher-Klasse findet match nicht Allgemeine Java-Themen 6
cool_brivk24 Variablen abfragen von Boolean von anderer Klasse Allgemeine Java-Themen 12
S Seltsames Ergebnis mit Date-Klasse Allgemeine Java-Themen 6
J int Werte in einer anderen Klasse in Arrays speichern Allgemeine Java-Themen 3
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
Neoline Klassen Singleton Klasse buchmanager Allgemeine Java-Themen 19
M Kapselung Modellierung von Intervallen: Klasse Interval Allgemeine Java-Themen 4
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
ReinerCoder Klasse kann nicht public deklariert werden Allgemeine Java-Themen 2
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
J IndexOutOfBoundsException bei der Nutzung der Klasse Message von mime4j Allgemeine Java-Themen 5
P Array einer abstrakten Klasse Allgemeine Java-Themen 4
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
kodela Dynamisches Array in einer Klasse Allgemeine Java-Themen 5
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
perlenfischer1984 Lombok Builder soll andere Klasse bauen Allgemeine Java-Themen 4
perlenfischer1984 Mit Lombok Builder Felder in Super Klasse füllen Allgemeine Java-Themen 12
T String aus While Schleife für ganze Klasse sichtbar machen Allgemeine Java-Themen 5
K Best Practice Auf die Klasse zugreifen im erzeugten ActionListener Allgemeine Java-Themen 2
K Mit Button neue Klasse öffnen Allgemeine Java-Themen 9
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
C Classpath Neue Klasse über einen Button ausführen Allgemeine Java-Themen 3
magdaStone Logikproblem Umschalten von booleans in anderer Klasse Allgemeine Java-Themen 7
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
A Java Klasse auf Tomcat während der Laufzeit austauschen Allgemeine Java-Themen 1
C Abstrakte Klasse, lokale Variable-Problem Allgemeine Java-Themen 1
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
Messoras Klassen Sämtliche Variablen einer Klasse übernehmen Allgemeine Java-Themen 6
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
B Animierte Klasse schreiben - Wie? Allgemeine Java-Themen 9
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
N Methoden Methoden einer Klasse auf Grundlage eines Strings aufrufen Allgemeine Java-Themen 6
AssELAss Log4j Logging Ausgabe für jede Klasse in seperates File Allgemeine Java-Themen 2
L Eclipse JavaFX Klasse starten programmatisch Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben