Quel est le plus court, le meilleur, le plus propre façon de définir un champ privé par réflexion en Java?

Andreas Hauschild:

Salut, je l'ai déjà travaillé avec la réflexion en Java. Mais si vous utilisez les standards Java (par exemple l'injection d'un champ privé), vous devez écrire beaucoup de code pour faire le travail.

Quel est le chemin le plus court pour injecter un champ privé dans un objet Java? Y at-il mises en œuvre dans les bibliothèques et largement utilisées de production prêtes?

Andreas Hauschild:

Le "One-Liner"

FieldUtils.writeField(Object target, String fieldName, Object value, boolean forceAccess)

Si votre projet utilise Apache Commons Lang le chemin le plus court pour définir une valeur par réflexion est d'utiliser la méthode statique « writeField » dans la catégorie « » org.apache.commons.lang3.reflect.FieldUtils

L'exemple simple suivant montre une librairie-objet avec un paymentService sur le terrain. Le code montre comment est défini deux fois avec une valeur différente du champ privé.

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());
        }
    }
}

Vous pouvez obtenir la lib par Maven central:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.8.1</version>
</dependency>

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=171579&siteId=1
conseillé
Classement