Lorsque vous souhaitez remplacer dynamiquement l'annotation dans Java 8

Contexte

Ce n'est pas une histoire très courante, mais vous voudrez peut-être changer dynamiquement une classe qui a une annotation telle que @Data (key = "1") en @Data (key = "2").

Solution

Java8 semble avoir des fonctions supplémentaires dans de tels cas, je me suis donc référé au site suivant.

Un peu plus simple

public class DynamicAnnotationReplaceUtils {
    private static final String ANNOTATIONS = "annotations";
    private static final String ANNOTATION_DATA = "annotationData";

    /**
     *Remplacez l'annotation d'une classe par une autre annotation.
     *
     * @since
     *
     * @param targetClazz Cette classe définit l'annotation à remplacer.
     * @param originalOne Annotation de la source de remplacement.
     * @param newOne L'annotation de destination de remplacement. Ce sera souvent une instance d'une classe qui étend l'annotation source de remplacement.
     */
  public static void annotationReplacedBy(Class<?> targetClazz, String originalName, Annotation newOne) {
        try {
            @SuppressWarnings("all")
            Method method = Class.class.getDeclaredMethod(ANNOTATION_DATA, null);
            method.setAccessible(true);

            Object annotationData = method.invoke(targetClazz);

            Field annotations = annotationData.getClass().getDeclaredField(ANNOTATIONS);
            annotations.setAccessible(true);

            @SuppressWarnings("unchecked")
            Map<Class<? extends Annotation>, Annotation> map =
                    (Map<Class<? extends Annotation>, Annotation>) annotations.get(annotationData);

            Annotation original = map.entrySet().stream().filter(e -> {
                return e.getKey().getSimpleName().equals(originalName());
            }).findFirst().get().getValue();

            if (original == null) {
                throw new IllegalArgumentException(
                        String.format("Class(%s) has not %s annotaion.",
                                targetClazz.getCanonicalName(), originalName));
            }

            map.put(original, newOne);
        } catch (Exception ex) {
            throw new IllegalArgumentException(ex);
        }
    }

Comment utiliser

DynamicAnnotationReplaceUtils.annotationReplacedBy(AnnotatedCalss.class, "Data", new ReplacedData()), 

Quelle est l'annotation de remplacement?

Définition de l'annotation de source de remplacement

@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Data {
    public abstract String key();
}

Définition de l'annotation de remplacement

public ReplacedData implements Data {
    public  String key() {
         return "2";
    }
}

Classe avec annotation de source de remplacement

@Data(key = "1")
public TestData() {
}

Recommended Posts

Lorsque vous souhaitez remplacer dynamiquement l'annotation dans Java 8
Lorsque vous souhaitez lier InputStream dans JDBI3
Une note quand vous voulez Tuple en Java
[Ruby] Lorsque vous souhaitez remplacer plusieurs caractères
Comment changer dynamiquement les JDK lors de la construction de Java avec Gradle
Code à utiliser lorsque vous souhaitez traiter Json en Java avec uniquement des bibliothèques standard
ProxyFactory est pratique lorsque vous souhaitez tester AOP avec Spring!
Utilisez JLine lorsque vous souhaitez gérer les frappes sur la console caractère par caractère en Java
Lorsque vous souhaitez implémenter des tests de bibliothèque Java avec Spock en multi-module avec Gradle dans Android Studio 3
(Limité à Java 7 ou version ultérieure) Je souhaite que vous compariez des objets dans Objects.equals
Si vous souhaitez incorporer dynamiquement des valeurs et ajouter du texte aux valeurs d'attribut dans Thymeleaf 3
Je souhaite obtenir l'adresse IP lors de la connexion au Wi-Fi avec Java
Je souhaite envoyer un e-mail en Java.
Lorsque vous souhaitez utiliser la méthode à l'extérieur
rsync4j --Je veux toucher rsync en Java.
[Swift] Utilisez nonzeroBitCount lorsque vous voulez popcnt dans Swift
Que faire lorsque vous pensez que vous ne pouvez pas Groovy-> Java avec IntelliJ IDEA CE
Lorsque vous souhaitez notifier une erreur quelque part lors de l'utilisation de graphql-spring-boot avec Spring Boot
Je veux faire quelque chose comme "cls" en Java
Je veux aussi utiliser ES2015 avec Java! → (´ ・ ω ・ `)
Vous n'avez pas besoin d'écrire deux fois lorsque vous créez un triangle rectangle en Java
Code utilisé lorsque vous souhaitez traiter Json avec uniquement des bibliothèques standard en Java (version améliorée) gson inutile
À vous qui êtes troublé par des points décimaux inattendus en Java
Résumé des sites d'étude Java que vous souhaitez lire attentivement
[# 3 Java] Lisez ceci si vous voulez étudier Java! ~ Sélectionné avec soin ~
Ce que vous utilisez souvent lorsque vous faites du développement Web avec Java
Lorsque vous souhaitez écrire explicitement OR ou AND avec ransack
Éléments à prendre en compte lors de l'écriture de code en Java
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3
docker-compose.yml lorsque vous voulez garder mysql en cours d'exécution avec docker
lombok.config lorsque vous voulez passer @Qualifier à @RequiredArgsConstructor avec lombok
Delicate est pratique à utiliser lorsque vous souhaitez réutiliser des pièces
Je souhaite simplifier l'instruction if-else de la branche conditionnelle en Java
[Ruby + Rails] Lorsque vous souhaitez vous inscrire dans la liste de diffusion de Mailchimp avec l'enregistrement de l'utilisateur
Comment écrire dans la classe Model lorsque vous souhaitez enregistrer des données binaires dans DB avec PlayFramework
Lorsque vous souhaitez refléter les informations de la branche principale dans la branche actuelle sur laquelle vous travaillez actuellement
[Swift] Lorsque vous voulez savoir si le nombre de caractères dans String correspond à un certain nombre ...
Dans Java 10, lorsque l'éclipse gradle est terminée et que JavaSE-1.10 sort, ...
Comparaison des chaînes de version lorsque vous souhaitez brancher le traitement entre deux versions (implémentation Java)
Multithread pour s'adapter au modèle [Java]
Comment écrire lorsque vous souhaitez conserver les sauts de ligne et la sortie tout en évitant XSS dans Rails
Lire CSV en Java (annotation Super CSV)
Comment apprendre JAVA en 7 jours
Si vous souhaitez inclure la classe parente dans @builder de Lombok
Si vous souhaitez modifier l'environnement de développement Java d'Eclipse
Enregistrer la sortie dans un fichier en Java
Comment écrire lorsque vous voulez gérer un "tableau de chaînes en langage C" comme argv [] dans Ruby-FFI
Paramètre qui se convertit en binding.pry lorsque vous tapez pry dans VScode
Que faire lorsque vous souhaitez connaître la position source où la méthode est définie dans binding.pry
J'ai fait une annotation en Java.
Comment utiliser les classes en Java?
Comment nommer des variables en Java
[Java] Je veux effectuer distinctement avec la clé dans l'objet
Comment résoudre l'erreur inconnue apparue lors de l'utilisation de slf4j en Java
Essayez d'implémenter Yuma en Java