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.
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.
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% 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
:
Sie können die Methode getCallerClass()
aufrufen:
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.
foo () ist privat, daher wird der Aufrufer immer in Klasse A sein.
Eine Hacky-Lösung ist sun.reflect.Reflection.getCallerClass
.
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.
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.
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