Hola Ya he trabajado con la reflexión en Java. Pero si está utilizando los estándares Java (por ejemplo, la inyección de un campo privado) que tiene que escribir un montón de código para hacer el trabajo.
¿Cuál es el camino más corto para inyectar un campo privado en un objeto de Java? ¿Hay implementaciones ampliamente utilizados en las bibliotecas y listas para producción?
El "de una sola línea"
FieldUtils.writeField(Object target, String fieldName, Object value, boolean forceAccess)
Si el proyecto utiliza Apache Commons Lang el camino más corto para establecer un valor a través de la reflexión es utilizar el método estático 'writeField' en la clase '' org.apache.commons.lang3.reflect.FieldUtils
El siguiente ejemplo muestra simples una librería-objeto con un PaymentService campo. Los espectáculos de código cómo el campo privado y están ubicadas dos veces con un valor diferente.
import org.apache.commons.lang3.reflect.FieldUtils;
public class Main2 {
public static void main(String[] args) throws IllegalAccessException {
Bookstore bookstore = new Bookstore();
//Just one line to inject the field via reflection
FieldUtils.writeField(bookstore, "paymentService",new Paypal(), true);
bookstore.pay(); // Prints: Paying with: Paypal
//Just one line to inject the field via reflection
FieldUtils.writeField(bookstore, "paymentService",new Visa(), true);
bookstore.pay();// Prints Paying with: Visa
}
public static class Paypal implements PaymentService{}
public static class Visa implements PaymentService{}
public static class Bookstore {
private PaymentService paymentService;
public void pay(){
System.out.println("Paying with: "+ this.paymentService.getClass().getSimpleName());
}
}
}
Puede obtener la lib través experta en el centro:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>