Предположим, у меня есть много классов, которые построены с использованием отражения Java (по некоторым причинам). Теперь мне нужно добавить значения в поля, которые
отмечены @PostInject
.
public class SomeClass {
@PostInject
private final String someString = null;
public void someMethod() {
// here, someString has a value.
}
}
У меня вопрос: Что такое быстрый способ задания поля с помощью отражения?
Помните, мне нужно делать это очень часто на многих уроках, это
почему производительность важна.
Что бы я делал интуицией, показывает этот псевдокод:
- получить все поля класса
clazz.getFields();
- чек, помеченный @ PostInject
eachField.getAnnotation(PostInject.class);
- сделать эти поля доступными
eachAnnotatedField.setAccessible(true);
- установить их на определенное значение
eachAnnotatedField.set(clazz, someValue);
Боюсь, что заполнить все поля - самая медленная вещь.
Могу ли я получить поле, если я знаю его с самого начала?
ПРИМЕЧАНИЕ: я не могу просто позволить классам реализовать некоторый интерфейс, который бы
позволяют устанавливать поля, используя метод. Мне нужно POJO.
ПРИМЕЧАНИЕ 2. Почему я хочу использовать инъекцию после поля: с точки зрения пользователя API, должна быть возможность использовать конечные поля. Кроме того, когда API априори не знает типы и количество полей, невозможно выполнить инициализацию полей с помощью интерфейса.
ПРИМЕЧАНИЕ2b: С точки зрения пользователя, окончательный контракт не нарушен. Это остается окончательным. Сначала поле инициализируется, затем его нельзя изменить. Кстати, есть много API, которые используют эту концепцию, одним из них является JAXB (часть JDK).