Wystąpił interesujący problem podczas opracowywania architektury ORM dla systemu Android. Używam biblioteki o nazwie dexmaker do manipulacji kodami bajtowymi, która pozwala mi tworzyć proxy dla trwałych obiektów w celu zaimplementowania leniwego ładowania.Uzyskiwanie dostępu do pól z obiektu Proxied
proxy przykład ma przyporządkowany InvocationHandler
tak, że gdy jest wywoływana na serwerze proxy, sposób invoke
jest wywoływana w InvocationHandler
, co wywołuje odpowiedni sposób w przybliżeniu z obiektu, przy założeniu, że został leniwie załadowany. Nic dziwnego - jest tak jak klasa Java Proxy, ale pozwala mi na pośredniczenie w rzeczywistych klasach zamiast na interfejsach (patrz dexmaker's ProxyBuilder).
Częścią, która staje się problematyczna, jest to, że używam również odbicia, aby pobrać wartości pól z trwałych obiektów i - teraz, gdy wprowadziłem leniwy ładunek - serwerów proxy. Oto co mam aktualnie robi:
for (Field f : getPersistentFields(model.getClass()) {
...
Object val = f.get(model); // model is either a persistent object or a proxy for one
mapField(f, val, map);
}
To oczywiście działa na regularnym modelu, ale za serwer proxy przypadkach f.get(model)
nie pobiera wartość pola przez proxy obiektu. Zamiast tego zwraca domyślną wartość przypisaną w konstruktorze klasy. Dostęp w polu proxy nie jest oczywiście przechwytywany.
Moje pytanie brzmi następująco: Czy istnieje sposób, aby przechwycić dostęp do zmiennej członkowskiej proxy dokonanej poprzez odbicie? Jeśli nie, jak mogę pobrać wartość pola proxy w sposób "podobny do odbicia"?
Możliwym obejście Zastanawiam byłoby odzyskać, a następnie wywołać metodę getter polu za pomocą refleksji, ale zastanawiam się, czy istnieje bardziej bezpośrednie rozwiązanie. To obejście, jeśli faktycznie jest to działa, wymagałoby, aby obiekt posiadał metodę gettera dla wszystkich trwałych pól - wymaganie, które zazwyczaj powinno być przestrzegane z punktu widzenia projektu OO, ale także wymusza więcej pracy na użytkowniku struktura.
Jestem otwarty na wszelkie pomysły.
Czy pola wciąż są modyfikowane? W jaki sposób? –
Pola proxy nie są modyfikowane. –
Czy mógłbyś nieco dopracować swój projekt? Czy klasy proxy reprezentują model lub czy mają połączenie z obiektem modelu? –