Supongamos que tengo muchas clases, que se construyen utilizando la reflexión de Java (por alguna razón). Ahora necesito post-inyectar valores a los campos, que son anotados con @PostInject
.Java: ¿Cuál es la forma más rápida de inyectar campos usando la reflexión?
public class SomeClass {
@PostInject
private final String someString = null;
public void someMethod() {
// here, someString has a value.
}
}
Mi pregunta es: ¿cuál es una forma rápida de establecer un campo utilizando la reflexión?
Recuerde, tengo que hacer esto muy a menudo en muchas clases, eso es por qué el rendimiento es relevante.
Lo que yo haría por la intuición se desprende de este pseudo-código:
- obtener todos los campos de la clase
clazz.getFields();
- cheque, que están anotados con @PostInject
eachField.getAnnotation(PostInject.class);
- hacer estos campos accesibles
eachAnnotatedField.setAccessible(true);
- configurarlos para un cierto valor
eachAnnotatedField.set(clazz, someValue);
Me temo que conseguir todos los campos es lo más lento que hacer.
¿Alguien puede obtener un campo, cuando lo sé desde el principio?
NOTA: No puedo dejar que las clases implementen alguna interfaz, lo que permitiría configurar los campos utilizando un método. Necesito
POJOs.
NOTA2: Por qué quiero una inyección de campo posterior: desde el punto de vista de un usuario de API, debe ser posible usar campos finales. Además, cuando los tipos y el número de campos no son conocidos por la API a priori, es imposible lograr la inicialización de campo utilizando una interfaz.
NOTE2b: Desde el punto de vista del usuario, el contrato final es no roto. Se mantiene final. Primero, un campo se inicializa, luego no se puede cambiar. Por cierto: hay muchas API que usan este concepto, una de ellas es JAXB (parte del JDK).
Tengo curiosidad de por qué tendrías que hacer esto? ¿Hay alguna historia interesante detrás de esta, y si la hay, puedes compartirla? –
Estoy escribiendo un marshaller | unmarshaller similar a JAXB, pero más especial (por lo tanto, más limitado). Los POJO con anotaciones son muy flexibles. –
Si está requiriendo que los implementadores usen su anotación, en realidad no está ganando nada con el uso de una interfaz aquí y no está realmente usando un POJO - http://en.wikipedia.org/wiki/Plain_Old_Java_Object#Contextual_variations – Nate