¿Cuál es el, mejor camino más corto, más limpio para establecer un campo privado a través de la reflexión en Java?

Andreas Hauschild:

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?

Andreas Hauschild:

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>

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=171581&siteId=1
Recomendado
Clasificación