Znalazłem sposób na zdobycie dziedziczonych członków przez class.getDeclaredFields();
i dostęp do prywatnych członków przez class.getFields()
Ale ja szukam prywatnych dziedziczonych pól. Jak mogę to osiągnąć?
109
Znalazłem sposób na zdobycie dziedziczonych członków przez class.getDeclaredFields();
i dostęp do prywatnych członków przez class.getFields()
Ale ja szukam prywatnych dziedziczonych pól. Jak mogę to osiągnąć?
Odpowiedzi:
Powinno to pokazać, jak go rozwiązać:
(Lub
Class.getDeclaredFields
dla tablicy wszystkich pól.)Wynik:
źródło
getSuperclass()
aż osiągniesz,null
jeśli chcesz iść wyżej.getDeclaredFields()[0]
lubgetDeclaredField("i")
raczej powtarzasz[0]
dostęp do tablicy w następnych dwóch instrukcjach?getDeclaredFields
. Odpowiedź została zaktualizowana.Najlepszym podejściem w tym przypadku jest użycie wzorca gościa, aby znaleźć wszystkie pola w klasie i wszystkie superklasy i wykonać na nich akcję zwrotną.
Realizacja
Spring ma ładną klasę Utility
ReflectionUtils
, która właśnie to robi: definiuje metodę pętli po wszystkich polach wszystkich superklas z wywołaniem zwrotnym:ReflectionUtils.doWithFields()
Dokumentacja:
Przykładowy kod:
Wynik:
źródło
To wystarczy:
Jeśli używasz narzędzia do pokrycia kodu, takiego jak EclEmma , musisz uważać: dodają one ukryte pole do każdej z twoich klas. W przypadku EclEmma te pola są oznaczone jako syntetyczne i możesz je odfiltrować w następujący sposób:
źródło
(na podstawie tej odpowiedzi)
źródło
W rzeczywistości używam złożonej hierarchii typów, więc rozwiązanie nie jest kompletne. Muszę wykonać wywołanie rekurencyjne, aby pobrać wszystkie prywatne pola dziedziczone. Oto moje rozwiązanie
źródło
Musiałem dodać obsługę dziedziczonych pól dla planów w Model Citizen . Wyprowadziłem tę metodę, która jest nieco bardziej zwięzła do pobierania pól klasy + dziedziczonych pól.
źródło
źródło