Zu Reflections & Annotations

hdi

Top Contributor
Hallo Forum!

Long time no see :)

Vorwort: Ich bin ja was Annotations und Reflections angeht beschämenderweise nach wie vor ein ganz schöner Noob, einfach da ich das bisher in meiner Arbeit kaum gebraucht habe. Aber ich denke bei meinem derzeitigen Projekt komme ich da nicht drumherum.

Ich frag einfach mal ganz blöd:

Java:
Object obj = something.method();

Gibt es eine Möglichkeit, innerhalb von method() herauszufinden, dass:
1) der zurückgegebene Wert in eine Variable abgespeichert wird
2) diese Variable "obj" heißt

Ich könnte mir vorstellen, dass sowas vllt mit Annotations und Reflections geht? Oder nicht? Falls nein, geht das denn irgendwie, zB mit bestimmten Frameworks?

Wenn ihr noch Background braucht zu meinem Projekt, lasst es mich wissen.

edit: Achso, in obigem Code wäre obj wohl eine lokale Variable.

Vielen Dank
lg Thomas
 
Zuletzt bearbeitet:

hdi

Top Contributor
Ich arbeite gerade an einem Framework zur Visualisierung von Algorithmen. Ich hätte gerne die Info, dass das Ergebnis der Methode in "obj" gespeichert wird, damit ich eine Visualisierung machen kann, die deckungsgleich ist mit dem Source Code. Dass in der Visualisierung also irgendwo der Name "obj" auftaucht. Natürlich könnte ich dem Methodenaufruf einen String übergeben, aber schöner wäre es, das aus dem Source Code selbst rausparsen zu können.

Mal eine andere Frage:

Java:
@MyAnnotation(string="whatever")
something.method();

Wenn die Klasse, in der dieser Code steht, gar nichts mit dem Typ von something zu tun hat, dann komm ich an diese Annotation innerhalb der method() auch nicht ran, oder?

Also generell: Ich würde gerne verschiedenste Meta-Infos aus dem Code parsen, während er ausgeführt wird. z.B. für jeden Aufruf von method(), in was für eine Variable der zurückgegebene Wert gespeichert wird oder - wie in dem Snippet hier jetzt - die Info aus einer Annotation, die an jeden Aufruf der Methode geheftet ist.

Lieg ich da mit Reflections und Annotations grundsätzlich falsch? Aber ich dachte für sowas sind Annotations schon da.

Oder kann es sein, dass ich hier wohl eher so in Richtung Java Debugging Interface denken muss?
 

anti-held

Bekanntes Mitglied
Ich verstehe leider nicht genau wofür du das brauchen könntest.
Nenne doch ein Beispiel.

Hast du ein Paket, von welchem du die Methoden überprüfen willst?
Bzw. was soll dann überprüft werden?
 

hdi

Top Contributor
Okay, mal ein konkretes Bsp. Angenommen du hast irgendeinen Algorithmus, in dem u.a. folgende Zeile vorkommt:

Java:
int max = array[0];

Ich will diesen Schritt visualisieren. Ich muss dafür also diese Anweisung in irgendein Format für mich bringen, das für eine Visualisierung geeignet ist. Wie auch immer das dann aussieht, ich benötige die Information:

- über das Array und seine Fächer, damit ich das zeichnen kann
- über die Variable max, und dass sie das Fach 0 indexiert, damit ich in meiner Zeichnung einen Pfeil auf das erste Fach mit dem Array machen kann, mit der Beschriftung "max"

So, mein Ansatz im Moment ist dass ich eine Library zur Verfügung stelle, mit der man seine Algorithmen schreibt. Ganz einfach weil ich dort dann diesen ganzen Code einbauen kann, der diese Infos scannt und in mein Visualisierungs-Format bringt. Also würdest du dann obige Zeile code mit meiner Library zB so schreiben:

Java:
ArrayReference<Integer> max = array.getElement(0);

Diese getElement-Methode entspricht jetzt quasi der "method" in meinem abstrakten Beispiel. Immer, wenn diese Methode aufgerufen wird, muss ich mir die o.g. Daten zusammensammeln die ich für die Visualisierung brauche.

Und damit eben das ganze zum Source Code passt, und man das nicht redundant schreiben muss, würde ich hier gerne einen Weg finden, wie ich zur Laufzeit bei Ausführung der getElement()-Methode irgendwie Zugriff auf den Caller der Methode habe, um dort zu kucken wie das abgespeichert wird, und auch ob da Annotationen dranhängen.

Zum Beispiel wäre es gut, wenn man an den eigentlichen Code noch Pseudo-Code hängen kann, den ich dann auch in der Visualisierung anzeigen kann. Darauf zielte meine zweite Frage mit den Annotations ab:

Java:
@PseudoCode(code=int max=array[0])
ArrayReference<Integer> max = array.getElement(0);

Und so sollte das funktionieren für den ganzen Algorithmus. Sowas wie

Java:
if(array[i] > max)

schreibst du dann unter Verwendung meiner Lib z.B. als

Java:
if(array.getElement(i).greater(max))

und auch hier wäre dann die Methode "greater" der Punkt, an dem ich die eigentliche Algorithmus-Logik um meine Visualisierungs-Infos anreichere.

Das ist so grob das Konzept. Und ich frage mich jetzt eben ob mir da Reflections und Annotations dienen können.
 

hdi

Top Contributor
Hat noch jemand eine Idee? Kennt niemand irgendeine Art Framework dass zur Laufzeit an Variablen-Namen rankommt? Oder lautet die Antwort tatsächlich:

Oder kann es sein, dass ich hier wohl eher so in Richtung Java Debugging Interface denken muss?

Falls jemandem irgendetwas zu meinem Problem einfällt, ich bin für jeden Tipp dankbar!

lg Thomas
 

anti-held

Bekanntes Mitglied
Es ist möglich, durch den StackTrace auf die Methode zu kommen, von der aus aufgerufen worden ist.

Java:
			for(StackTraceElement elem: Thread.currentThread().getStackTrace()){
				System.out.println(elem.getClassName() + ", " + elem.getMethodName() + ", " + elem.getLineNumber());
			}

So könntest du auf die Zeile im Code kommen die du suchst.
Und wenn du zusätzlich den Quellcode hast, kannst du auch dann den Variablennamen herauslesen.

Eine bessere Möglichkeit fällt mir nicht ein. Sry
 

KSG9|sebastian

Top Contributor
Ich glaub ein Ansatz passt irgendwie nicht so recht. Variablennamen gibt es zur Laufzeit nicht, den Sourcecode zu parsen würde ich die Finger davon lassen.

Beschreib mal etwas mehr high-level was du machen willst.
 

hdi

Top Contributor
Naja wie ich es oben erklärt hatte, ich will einen Algorithmus visualisieren, und zur ordentlichen grafischen Darstellung müsste ich gewisse Dinge in der Visualisierung, wie beispielsweise Pfeile oder Links etc, mit Namen beschriften. Und diese Namen sollten optimalerweise zum Source Code passen, damit der Betrachter der Visualisierung die Grafik gut dem Code zuordnen kann.

Also zB hat man im Algorithmus eine Anweisung:

int max = array[0]

Neben der eigentlichen Visualisierung zeige ich den Code und markiere diese Zeile dort, damit man nachvollziehen kann was der Algo gerade tut. Und in der Grafik zeichne ich in diesem Schritt mein Array und eine Markierung auf das erste Fach, die mit "max" beschriftet ist.

Die Idee ist also, diesen Bezeichner irgendwie direkt aus dem Source Code rauszubekommen, damit der Coder des Algorithmus nicht über irgendwelche Methodenaufrufe oder zusätzliche Parameter explizit sagen muss, dass diese Referenz auf das Array mit "max" beschriftet werden soll. Denn der Algorithmus-Code selbst sollte möglichst unabhängig von der Visualisierung sein. Man sollte da also möglichst wenig "Metacode" für die Visualisierung einbauen müssen als Anwender.
 
Zuletzt bearbeitet:

KSG9|sebastian

Top Contributor
Der User gibt doch keinen Code ein sondern eine Formel?!

Ich versteh den Sinn deines Frameworks nicht so recht. Kann dir nur sagen das es nicht möglich ist die Namen von lokalen Variablen rauszufinden.

Gruß Sebastian
 

hdi

Top Contributor
Der User gibt doch keinen Code ein sondern eine Formel?!

Nein, der User = der Programmierer eines Algorithmus. Der Sinn des Frameworks liegt darin, es einem Programmierer leichter zu machen, einen Algorithmus mit Visualisierung zu implementieren. Hauptanwendungsfeld ist die Lehre, zB Profs an der Uni, die ihren Studenten klarmachen wollen wie gewisse Sortieralgorithmen oder Baumstrukturen arbeiten. Ich möchte ein Framework schreiben, mit dem solche Algorithmen (so gut es geht) automatisiert visualisiert werden können.

Kann dir nur sagen das es nicht möglich ist die Namen von lokalen Variablen rauszufinden.
Blöd ;(

Aber danke für die Antwort
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Java Reflections Allgemeine Java-Themen 6
T Diskussion - Reflections Allgemeine Java-Themen 21
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
M Typ einer inneren Klasse mit reflections finden Allgemeine Java-Themen 7
T Klasse mit Reflections adden Allgemeine Java-Themen 3
K Reflections Fragen Allgemeine Java-Themen 7
hdi Dynamisches Instantiieren (Reflections) Allgemeine Java-Themen 4
S Reflections (invoke-Methode) Allgemeine Java-Themen 13
G Typ Parameter & Reflections Allgemeine Java-Themen 4
Nils_Langner Wo bin ich gerade? Reflections Allgemeine Java-Themen 3
S Reflections und inherited Fields Allgemeine Java-Themen 4
S Reflections und final Allgemeine Java-Themen 19
N Reflections mit Unter- und Oberklasse Allgemeine Java-Themen 2
F Reflections Allgemeine Java-Themen 6
S Auf statische Funktionen mit Java Reflections zugreifen Allgemeine Java-Themen 3
T Java Class Intrumentation mit Annotations in Laufzeit Allgemeine Java-Themen 1
C Polymorphie Fragen zur Annotations von Persistenz Allgemeine Java-Themen 2
L Annotations um Gültigkeit von Attributen zu definieren? Allgemeine Java-Themen 4
K Annotations der aufrufenden Methode ermitteln Allgemeine Java-Themen 11
ruutaiokwu junit mit annotations geht nicht? Allgemeine Java-Themen 5
N Method-Annotations in aufgerufener Methode auswerten Allgemeine Java-Themen 2
W Annotations selbst erstellen und auswerten Allgemeine Java-Themen 4
dunhillone Mittels Annotations Methoden "erweitern"? Allgemeine Java-Themen 11
V Reflection - Field-Instanz und Annotations Allgemeine Java-Themen 6
Landei Annotations ableiten Allgemeine Java-Themen 2
G Annotations. warum ? Allgemeine Java-Themen 9
L Annotations mit Vererbung Allgemeine Java-Themen 4
H eigene Annotations Allgemeine Java-Themen 2
byte Annotations: Arrays auslagern Allgemeine Java-Themen 2
G @Annotations Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben