2017-12-12 4 views
2

Ich habe die folgende generische Funktion, die ich aus mehreren Klassen verwenden möchte. Das Problem ist, dass ich die Feldobjekte wegen der Sichtbarkeit nicht abrufen kann, wenn ich das aus einer Hilfsklasse aufrufe.Java Reflektion auf Felder von einer Hilfsklasse

public <T> List<T> descendingServices(Class<T> cls) { 
    List<T> descendings = new ArrayList<>(); 

    for (Field field : EnvironmentServiceImpl.class.getDeclaredFields()) { 
    Object obj; 
    try { 
     obj = field.get(this); 
     if (cls.isInstance(obj)) { 
     T descending = (T) obj; 
     descendings.add(descending); 
     } 
    } catch (IllegalAccessException e) { 
    } 
    } 

    return descendings; 
} 

Kann ich das irgendwie umgehen, ohne setAccessible auf dem Feld verwendet?

+0

nein. Sie können zweimal darauf zugreifen, obwohl Bearbeiten: sieht aus wie Sie ein neues Objekt bekommen, so dass Sie es nicht einmal zurücksetzen müssen –

+0

siehe: https://stackoverflow.com/questions/10638826/java-reflection-impact-of- setaccessibletrue –

Antwort

1

Die Lösung wäre, darüber nachzudenken, wie Sie auf das Feld zugreifen würden, wenn Sie nicht zuerst Reflexion verwenden würden. Dann können Sie den Reflexionscode hinzufügen, nachdem Sie herausgefunden haben, wie Sie auf die Daten zugreifen können.

Wenn Sie nicht auf das Feld zugreifen können, weil es nicht public ist, sollte die Klasse, die das Feld deklarierte, eine public Getter-Methode deklarieren, die auf das Feld für Sie zugreift und die Kapselung für sich bereitstellt.

Fügen Sie der Klasse bei Bedarf Getter-Methoden hinzu. Dann rufen Sie Class 's getMethods Methode anstelle von getDeclaredFields. Möglicherweise müssen Sie andere Methoden umgehen, die Sie nicht verarbeiten möchten.

Vom Javadocs for getMethods:

Gibt ein Array mit Method reflektierenden Objekten alle öffentlichen Methoden der Klasse oder Schnittstelle dieses Class Objekt dargestellt, die von der Klasse oder Schnittstelle und solche, einschließlich der aus Oberklassen geerbt erklärt und Superschnittstellen.

Verwandte Themen