Ich habe ein interessantes Problem bei der Entwicklung eines ORM-Frameworks für Android festgestellt. Ich verwende eine Bibliothek mit dem Namen dexmaker für die Bytecode-Manipulation, mit der ich Proxies für persistente Objekte erstellen kann, um sie zu implementieren Lazy Loading.
Der proxied-Instanz ist eine InvocationHandler
zugeordnet, so dass beim Aufruf einer Methode für den Proxy die invoke
-Methode für InvocationHandler
aufgerufen wird, die dann die entsprechende Methode des proxied-Objekts aufruft, vorausgesetzt, dass sie faul geladen wurde. Nichts zu Überraschendes - es ist genau wie Javas Proxy Klasse, aber erlaubt mir, anstelle von Schnittstellen echte Klassen zu ersetzen (siehe ProxyBuilder ).
Der Teil, der problematisch geworden ist, ist, dass ich auch Reflektion verwende, um Feldwerte von persistenten Objekten abzurufen und - jetzt, wo ich lazy loading - Proxies eingeführt habe. Hier ist, was ich gerade mache:
%Vor% Dies funktioniert natürlich für reguläre Modellinstanzen, aber für proxied-Instanzen ruft f.get(model)
nicht den Feldwert des proxied-Objekts ab. Stattdessen gibt es den Standardwert zurück, der im Konstruktor der Klasse zugewiesen wurde. Der Zugriff auf das Proxy-Feld wird offensichtlich nicht abgefangen.
Meine Frage lautet wie folgt: Gibt es eine Möglichkeit, einen Zugriff auf die durch Reflektion erstellte Variable eines Proxys abzufangen? Wenn nicht, wie kann ich den Wert eines Proxy-Felds in einer "reflektionsähnlichen" Weise abrufen?
Eine mögliche Problemumgehung Ich denke daran, die Getter-Methode des Felds mithilfe der Reflektion abzurufen und dann aufzurufen, aber ich frage mich, ob es eine direktere Lösung gibt. Wenn diese Problemumgehung tatsächlich funktioniert , müsste das Objekt über eine Getter-Methode für alle persistenten Felder verfügen - eine Anforderung, die normalerweise aus Sicht des OO-Designs befolgt werden sollte, aber auch mehr Arbeit erfordert auf den Benutzer des Frameworks.
Ich bin für irgendwelche Ideen offen.
Eine gute Lösung besteht darin, mit Setter / Getter auf die Felder zuzugreifen, anstatt die Field-Klasse zu verwenden. (Ich glaube, das ist mehr als ein Workaround)
Auf der anderen Seite, wenn Sie mit dem Direct Field Access-Ansatz gehen wollen. Soweit ich sehe, gibt es keine einfache Möglichkeit, Feldzugriffe abzufangen. Überprüfen Sie die Antworten zu diese Frage . Die Frage bezieht sich jedoch auf das Abfangen von Feldmodifikationen anstatt auf das Lesen das Feld, kann es einige Einblicke und Richtung geben.
Tags und Links java android reflection proxy dalvik