2016-12-23 16 views
5

Używam dziedziczonych klas komponentów bean dla mojego projektu. Tutaj niektóre super klasy będą puste, a podklasy mogą mieć pola & niektóre podklasy będą puste, a super klasa może zawierać pola.Java Reflection - Uzyskaj pola z klasy Sub oraz Super Class

Moim żądaniem jest pobranie wszystkich prywatnych/publicznych pól z klasy Podrzędnej, a także uzyskanie wszystkich publicznych/chronionych pól z Super klasy.

Poniżej próbowałem to osiągnąć. Ale nie udało mi się spełnić mojego wymogu. Proszę podać kilka sugestii, aby osiągnąć ten.

Field fields [] = obj.getClass().getSuperclass().getDeclaredFields(); 

Jeśli używam wyżej kod, mogę tylko pola Super klasa

Field fields [] = obj.getClass().getFields(); 

Jeśli używam wyżej kod, mogę dostać wszystkie pola z pola PODKLASA i super klasy

Field fields [] = obj.getClass().getDeclaredFields(); 

Jeśli użyję powyższego kodu, mogę uzyskać wszystkie klasy publiczne i prywatne dla wszystkich pól.

+0

Co jeśli iterację subclass-> łańcucha nadklasy i zbierać na polach? –

+2

Wygląda na to, że już wiesz, jak uzyskać wszystkie potrzebne dane, więc w czym problem? Jeśli uważasz, że powinieneś być w stanie uzyskać wszystko za jednym razem, to prawdopodobnie jest to błąd. Może być konieczne wykonanie wielu połączeń i może być konieczne odfiltrowanie niektórych danych. Ale nie rozumiem, co próbujesz osiągnąć i dlaczego niektóre kombinacje twoich przykładów tego nie powodują. – ajb

+0

@ ajb. Próbuję uzyskać jedno wywołanie dla pól sub i super klasy. Zwróć uwagę na swój punkt widzenia i dziękuję za odpowiedź. – DEADEND

Odpowiedz

6

Trzeba będzie iteracyjne nad wszystkimi superklas twojej klasie, tak:

private List<Field> getInheritedPrivateFields(Class<?> type) { 
    List<Field> result = new ArrayList<Field>(); 

    Class<?> i = type; 
    while (i != null && i != Object.class) { 
     Collections.addAll(result, i.getDeclaredFields()); 
     i = i.getSuperclass(); 
    } 

    return result; 
} 
+0

Problem kompilacji w linii result.addAll ((i.getDeclaredFields()); – DEADEND

+0

List.addAll nie pobiera tablicy. Użyj 'Collections.addAll (result, i.getDeclaredFields());' –

+0

Dziękuję @ jqno & @ Klitos Kyriacou – DEADEND

Powiązane problemy