2017-07-29 6 views
3

Spielen mit java.lang.reflect und frage mich, ob es irgendwelche Möglichkeiten ist die Zuordnung Wert eines java.lang.reflect.FieldReflektion: Wie erhält man den Wert eines Feldes ohne Auswertung?

Beispiel

public class Dummy { 
    String envHttpPort = System.getenv("HTTP_PORT"); 
} 

Von Java-Reflexion zu bekommen ich den Wert der haben möchte System.getenv("HTTP_PORT"); statt null als es zurück scheint durch Instanziierung der Klasse, die, soweit ich weiß, erforderlich ist, um die Werte des Feldes abzurufen, wäre der Wert des System.getenv (String) -Aufrufs, was nicht das ist, was ich will.

Ist es möglich, das Feld und den Wert so zu lesen, wie es ist?

Gesucht Ausgang wäre der gleiche wie der Quellcode.

Ich hoffe, Sie verstehen, wenn nicht bitte lass es mich wissen, und ich werde versuchen, die Frage umzuformulieren.

+3

Sie versuchen also, den Code 'System.getenv (" HTTP_PORT ") zurückzubekommen und ihn selbst oder etwas Ähnliches zu bewerten? Warum? Ich vermute, es gibt einen einfacheren/besseren Weg, um jedes Problem zu lösen, an dem Sie gerade arbeiten ... –

+6

Ich stimme Matt zu. Das sieht nach einem anderen Fall von [X/Y-Problem] aus (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – Pshemo

+0

Der Grund, warum ich frage, ist, dass ich meinen Quellcode haben möchte in der Lage, Dokumentation mit den Endpunkten zu generieren, die ich in System.getenv verwende, indem ich ein Präfix/eine Annotation verwende, die ich vermuten würde, und einen anderen Grund, den "echten" Wert von Feld x zu sehen, wäre, das Duplikat zu reduzieren. Stellen Sie sich vor, Sie würden viele Umgebungsvariablen schreiben, und Sie müssen diese in den JavaDoc kopieren, stattdessen wäre es meine Vision, parallel zu einem Build oder Test zu laufen und einen Bericht über die Umgebungsvariablen oder die Routenendpunkte zu erhalten. –

Antwort

0

Nein, es ist nicht möglich, "den Zuweisungswert" eines Feldes zu erhalten, (wie Sie es willkürlich für diese Frage definiert haben), denn wie Sie bereits gesehen haben, ist es kein Wert, es ist ein Stück Code.

Dieser Code ist Teil der Initialisierung der Instanz und kann nicht ohne Bytecode-Manipulation extrahiert werden. Selbst wenn es extrahiert werden könnte, würde es nur wissen, wie der Wert eines bestimmten Feldes einer bestimmten Klasse gesetzt wird, es würde keinen Wert zurückgeben, den Sie verwenden können. Es würde sehr wahrscheinlich auch anderen Code der Klasse aufrufen, ihre Aufgabe zu erledigen, und selbst wenn es Ihnen irgendwie gelungen wäre, sie zu isolieren, wäre es nicht möglich, sie außerhalb der normalen Initialisierung der Instanz auszuführen.

Lange Rede kurzer Sinn, denke nicht einmal daran.

Verwandte Themen