Die Situation scheint abnormal zu sein, aber ich wurde gebeten, einen Serializer zu erstellen, der ein Objekt in einen String zerlegt, indem er die Ergebnisse von "get" -Methoden verkettet. Die Werte sollten in der gleichen Reihenfolge angezeigt werden, in der ihr "Get" -Äquivalent in der Quellcodedatei angegeben ist.
So haben wir zum Beispiel
%Vor%Das Ergebnis sollte lauten:
%Vor%Ein nicht
%Vor% Es kann nicht mit Class
object gemäß der Dokumentation durchgeführt werden. Aber ich frage mich, ob ich diese Informationen in der "* .class" -Datei finden kann oder ist sie verloren? Wenn solche Daten existieren, kennt jemand vielleicht ein gebrauchsfertiges Werkzeug für diesen Zweck? Wenn solche Informationen nicht gefunden werden können, schlagen Sie bitte den professionellsten Weg vor, um das Ziel zu erreichen. Ich dachte daran, den Gettern der Klasse, die serialisiert werden sollte, eine Art von benutzerdefinierten Anmerkungen hinzuzufügen.
Wenn Sie möchten, dass Sie den Quellcode analysieren müssen, nicht den Bytecode.
Es gibt eine Reihe von Bibliotheken, die eine Quelldatei in einer Knotenstruktur analysieren, am liebsten javaparser ( gehostet unter code.google.com), das in einer leicht modifizierten Version auch von spring roo verwendet wird.
Auf der Benutzungsseite finden Sie einige Beispiele. Grundsätzlich möchten Sie einen Besucher verwenden, der auf MethodDefinitions hört.
Obwohl die Reflektion nicht mehr (wie bei Java 7, glaube ich) Ihnen die Methoden in der Reihenfolge gibt, in der sie im Quellcode erscheinen, scheint die Klassendatei immer noch (ab Java 8) die Methoden in der Reihenfolge zu enthalten in dem sie im Quellcode erscheinen.
Sie können die Klassendatei also analysieren, indem Sie nach Methodennamen suchen, und dann die Methoden basierend auf dem Dateioffset sortieren, in dem jede Methode gefunden wurde.
Wenn Sie es weniger hacky machen wollen, können Sie Javassist verwenden, das Ihnen die Zeilennummer jeder deklarierten Methode gibt, so dass Sie Methoden nach Zeilennummer sortieren können.
Bearbeiten: Dies funktioniert nur bei konkreten Klassen (die zu untersuchende Klasse hat ihre eigene .class-Datei). Ich habe den folgenden Code geändert, um dies zu verdeutlichen. Bevor Sie tiefer in die ClassFileAnalyzer-Bibliothek eintauchen, um mit Klassen direkt zu arbeiten, anstatt sie aus einer temporären Datei zu lesen, besteht diese Einschränkung.
Der folgende Ansatz funktioniert für mich:
Laden Sie folgende Bibliothek herunter und importieren Sie sie ClassFileAnalyzer
Fügen Sie die folgenden zwei statischen Methoden hinzu (Achtung! getClussDump () benötigt eine kleine Änderung, um die Klassendatei in eine temporäre Datei zu schreiben: Ich habe meinen Code hier entfernt, weil er an dieser Stelle sehr speziell ist):
%Vor%Nun können Sie sortMethodsBySourceOrder mit einer beliebigen Liste von Methoden aufrufen (weil das Sortieren von Arrays nicht sehr komfortabel ist) und Sie werden die Liste wieder sortiert bekommen.
Es funktioniert, indem Sie den konstanten Pool der Klassen-Dumps betrachten, der wiederum von der Bibliothek bestimmt werden kann.
Greetz, GHad
Tags und Links java reflection