Wie bekomme ich den Namen der aufrufenden Klasse in Java?

8

Ich hätte gerne etwas Hilfe in dieser Angelegenheit,

Beispiel:

%Vor%

Dies ist im Grunde das Szenario. Meine Frage ist, wie kann Methode foo() wissen, wer es anruft?

BEARBEITEN : Grundsätzlich versuche ich eine Datenbank-Ebene zu erstellen, und in Klasse A werde ich eine Methode erstellen, die SQL-Anweisungen generiert. Solche Anweisungen werden dynamisch generiert, indem die Werte aller öffentlichen Eigenschaften der aufrufenden Klasse abgerufen werden.

    
Mark Buhagiar 08.11.2009, 13:33
quelle

9 Antworten

27

Der einfachste Weg ist folgendes:

%Vor%

Aber in Wirklichkeit sollte das nicht nötig sein, außer für einige Protokollierungszwecke, weil das eine ziemlich teure Aufgabe ist. Was ist das Problem, für das Sie denken, dass dies die Lösung ist? Wir können uns viel bessere Vorschläge einfallen lassen.

Bearbeiten : Sie haben Folgendes kommentiert:

  

Ich versuche grundsätzlich, eine Datenbank-Ebene zu erstellen, und in Klasse A werde ich eine Methode erstellen, die SQL-Anweisungen generiert. Solche Anweisungen werden dynamisch generiert, indem die Werte aller öffentlichen Eigenschaften der aufrufenden Klasse abgerufen werden .

Ich empfehle dann dringend, nach einer vorhandenen ORM-Bibliothek zu suchen, z. B. Hibernate , iBatis oder JPA-Implementierung nach Ihrem Geschmack.

    
BalusC 08.11.2009 13:35
quelle
14

Vielleicht wäre es für Ihren Anwendungsfall sinnvoll, die Klasse des Aufrufers in die Methode zu übernehmen, zB:

%Vor%

Und nenne es etwa so:

%Vor%     
Fabian Steeg 08.11.2009 13:52
quelle
5

Java 9: ​​Stack-Lauf-API

JEP 259 bietet eine effiziente Standard-API für Stack-Walking, die ein einfaches Filtern und einen einfachen Zugriff auf die Informationen ermöglicht in Stapelspuren. Zunächst sollten Sie eine Instanz von StackWalker :

erhalten %Vor%

Sie können die Methode getCallerClass() aufrufen:

%Vor%

Unabhängig davon, wie Sie die StackWalker -Instanz konfiguriert haben, ignoriert die getCallerClass -Methode die Reflection-Frames und die verdeckten Frames, die mit MethodHandle s zusammenhängen. Außerdem sollte diese Methode nicht im ersten Stack-Frame aufgerufen werden.

    
Ali Dehghani 22.08.2017 07:07
quelle
4

foo () ist privat, daher wird der Aufrufer immer in Klasse A sein.

    
alternative 08.11.2009 13:38
quelle
1

Von einer Stapelspur: Ссылка

    
quant_dev 08.11.2009 13:35
quelle
0

Eine Hacky-Lösung ist sun.reflect.Reflection.getCallerClass .

%Vor%

Es ist Hacky, weil Sie sicherstellen müssen, dass die Klasse, die Reflection.getCallerClass() aufruft, auf dem bootstrap ClassLoader für die Annotation @CallerSensitive (womit getCallerClass markiert ist) funktioniert. Daher ist es wahrscheinlich nicht die beste Lösung für ein Projekt, es sei denn, Ihr Projekt verwendet ein Java-Agent , um Ihre Klassen zur Bootstrap-ClassLoader-Suche hinzuzufügen.

    
Link TheProgrammer 18.08.2017 23:05
quelle
0

wenn Sie slf4j als Anwendungsprotokollsystem verwenden. Sie können verwenden:

%Vor%

Ich denke, es ist schneller als new Exception (). getStackTrace (), da getStackTrace () always Klon stacktrace ausführt.

    
Fulai Zhang 12.01.2018 05:32
quelle
-1

Ich habe es versucht und es funktioniert gut. Dies liegt daran, dass jedes Java-Objekt Zugriff auf die Methode getClass () hat, die den Aufruf der Klasse und den Methodennamen zurückgibt.

%Vor%

Beispiel Verwendung:

%Vor%

Beispielausgabeprotokoll mit java.util.logging.Logger;

01.02.2017 11:14:50 PM rmg.data.model.DBTable (init) INFO: fertig

    
resti 01.02.2017 15:25
quelle
-2

Vielleicht ist die Antwort hier:

%Vor%     
Piyush 25.11.2013 20:23
quelle

Tags und Links