Предположим, у меня много классов, которые построены с использованием отражения Java (по какой-то причине). Теперь мне нужно после ввода значений в поля, которые аннотируются с @PostInject
.Java: Каков самый быстрый способ ввода полей с использованием отражения?
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 априори, невозможно осуществить инициализацию поля с использованием интерфейса.
NOTE2b: С точки зрения пользователя, окончательный контракт не сломана. Он остается окончательным. Во-первых, поле инициализируется, тогда его нельзя изменить. Кстати, есть много API, которые используют эту концепцию, один из которых - JAXB (часть JDK).
Мне просто интересно, зачем вам это нужно? Есть ли интересная история за этим, и если есть, можете ли вы поделиться ею? –
Я пишу marshaller | unmarshaller, похожий на JAXB, но более специальный (таким образом, более ограниченный). POJO с аннотациями просто очень гибкие. –
Если вы хотите, чтобы разработчики использовали вашу аннотацию - вы на самом деле ничего не получаете от использования интерфейса здесь, и вы на самом деле не используете POJO - http://en.wikipedia.org/wiki/Plain_Old_Java_Object#Contextual_variations – Nate