Moja aplikacja buduje pamięć podręczną Field, do której będzie można uzyskać dostęp później w trakcie jej życia. Pomyślałem, że utworzenie indeksu Field byłoby szybsze niż wyszukiwanie za każdym razem, gdy potrzebuję dostępu do Field. Chociaż i tak nie widzę użycia Field w obiekcie Java.

POJO:

public class Employee {
    private String firstName;

    private String lastName;

    Employee(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}

Przykład:

public static void main(String[] args) throws IOException {
    Map<String, Field> fields = new HashMap<>();

    for (Field field : Employee.class.getDeclaredFields()) {
        fields.add(field.getName(), field);
    }

    Object employee = new Employee("bob", "saget");

    fields.entrySet().forEach((entry) -> {
        // Showing intent, obviously getFieldValue doesn't exist
        System.out.println("Field " + entry.getKey() + ": " + employee.getClass().getFieldValue(entry.getValue());
    });
}

Oczekiwany wynik:

Field firstName: bob
Field lastName: saget
0
user0000001 20 listopad 2019, 20:41
1
 – 
JB Nizet
20 listopad 2019, 20:44
2
Jednak najprawdopodobniej nie powinieneś używać refleksji. Jeśli wyjaśnisz, co tak naprawdę próbujesz osiągnąć, prawdopodobnie bylibyśmy w stanie zapewnić czystszą, bezpieczniejszą i szybszą strategię.
 – 
JB Nizet
20 listopad 2019, 20:46
Utworzyłem zestaw adnotacji niestandardowych, które uwidaczniają POJO w moim frameworku. Użytkownik dostarcza pakiet do skanowania tych POJO i jest indeksowany przez framework. Do tego momentu framework nie ma pojęcia o tych klasach. Adnotacje instruują moje ramy, aby wykonać określone zadania. Wiem, że to niewiarygodnie niejasne i prawdopodobnie nie pomaga, ale jestem prawie pewien, że refleksja jest jedynym sposobem, w jaki mój framework może zrozumieć strukturę tych POJO.
 – 
user0000001
20 listopad 2019, 20:51
I dziękuję. To jest moja pierwsza próba użycia koncepcji Field z pakietu refleksji. Zadziałało!
 – 
user0000001
20 listopad 2019, 20:52
Nie jestem pewien, na czym polega problem.
 – 
Jarvis
20 listopad 2019, 22:31

1 odpowiedź

Nie jestem pewien, dlaczego używasz odbicia, ale to dałoby Ci określony „Oczekiwany wynik”

public class Employee {
    private String firstName;

    private String lastName;

    Employee(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public static void main(String[] args) throws IOException {
        Map<String, Field> fields = new HashMap<>();
        for (Field field : Employee.class.getDeclaredFields()) {
            fields.put(field.getName(), field);
        }
        Object employee = new Employee("bob", "saget");
        fields.entrySet().forEach((entry) -> {
            try {
                System.out.println("Field " + entry.getKey() + ": " + entry.getValue().get(employee));
            } catch (IllegalArgumentException | IllegalAccessException e) {
            }
        });
    }
}
0
John Stringer 21 listopad 2019, 12:55