Wenn Sie Annotation in Java 8 dynamisch ersetzen möchten

Hintergrund

Es ist keine sehr häufige Geschichte, aber Sie können eine Klasse mit einer Annotation wie @Data (key = "1") dynamisch in @Data (key = "2") ändern.

Lösung

Java8 scheint in solchen Fällen zusätzliche Funktionen zu haben, daher habe ich auf die folgende Site verwiesen.

Ein bisschen einfacher

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

    /**
     *Ersetzen Sie die Annotation einer Klasse durch eine andere Annotation.
     *
     * @since
     *
     * @param targetClazz Diese Klasse legt die zu ersetzende Anmerkung fest.
     * @param originalOne Annotation der Ersatzquelle.
     * @param newOne Die Annotation des Ersatzziels. Es handelt sich häufig um eine Instanz einer Klasse, die die Annotation der Ersatzquelle erweitert.
     */
  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);
        }
    }

Wie benutzt man

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

Was ist die Ersatzanmerkung?

Definition der Ersatzquellenanmerkung

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

Definition der Ersatzanmerkung

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

Klasse mit Ersatzquellenanmerkung

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

Recommended Posts

Wenn Sie Annotation in Java 8 dynamisch ersetzen möchten
Wenn Sie InputStream in JDBI3 binden möchten
Ein Hinweis, wenn Sie Tupel in Java möchten
[Ruby] Wenn Sie mehrere Zeichen ersetzen möchten
Dynamisches Wechseln von JDKs beim Erstellen von Java mit Gradle
Code, der verwendet werden soll, wenn Sie Json nur mit Standardbibliotheken in Java verarbeiten möchten
ProxyFactory ist praktisch, wenn Sie AOP mit Spring testen möchten!
Verwenden Sie JLine, wenn Sie Tastenanschläge auf der Konsole zeichenweise in Java verarbeiten möchten
Wenn Sie Java-Bibliothekstests mit Spock in mehreren Modulen mit Gradle in Android Studio 3 implementieren möchten
(Beschränkt auf Java 7 oder höher) Ich möchte, dass Sie Objekte in Objects.equals vergleichen
Wenn Sie Werte dynamisch einbetten und Attributwerten in Thymeleaf 3 Text hinzufügen möchten
Ich möchte die IP-Adresse erhalten, wenn ich mit Java eine Verbindung zu Wi-Fi herstelle
Ich möchte eine E-Mail in Java senden.
Wenn Sie die Methode außerhalb verwenden möchten
rsync4j - Ich möchte rsync in Java berühren.
[Swift] Verwenden Sie nonzeroBitCount, wenn Sie in Swift popcnt möchten
Was tun, wenn Sie glauben, dass Sie mit IntelliJ IDEA CE nicht Groovy-> Java können?
Wenn Sie irgendwo einen Fehler melden möchten, wenn Sie graphql-spring-boot mit Spring Boot verwenden
Ich möchte so etwas wie "cls" in Java machen
Ich möchte ES2015 auch in Java verwenden! → (´ ・ ω ・ `)
Sie müssen nicht zweimal schreiben, wenn Sie in Java ein rechtwinkliges Dreieck erstellen
Code, der verwendet wird, wenn Sie Json nur mit Standardbibliotheken in Java (verbesserte Version) verarbeiten möchten. Gson ist nicht erforderlich
Für Sie, die von unerwarteten Dezimalstellen in Java betroffen sind
Zusammenfassung der Java-Lernseiten, die Sie sorgfältig lesen möchten
[# 3 Java] Lesen Sie dies, wenn Sie Java lernen möchten! ~ Sorgfältig ausgewählt ~
Dinge, die Sie häufig bei der Webentwicklung mit Java verwenden
Wenn Sie explizit ODER oder UND mit Ransack schreiben möchten
Dinge, die Sie beim Schreiben von Code in Java beachten sollten
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben
docker-compose.yml, wenn Sie MySQL auf Docker laufen lassen möchten
lombok.config, wenn Sie @Qualifier mit lombok an @RequiredArgsConstructor übergeben möchten
Delicate ist praktisch, wenn Sie Teile wiederverwenden möchten
Ich möchte die if-else-Anweisung für bedingte Verzweigungen in Java vereinfachen
[Ruby + Rails] Wenn Sie sich zusammen mit der Benutzerregistrierung in der Mailchimp-Mailingliste registrieren möchten
So schreiben Sie in die Modellklasse, wenn Sie mit PlayFramework Binärdaten in der Datenbank speichern möchten
Wenn Sie die Hauptzweiginformationen in dem aktuellen Zweig wiedergeben möchten, an dem Sie gerade arbeiten
[Swift] Wenn Sie wissen möchten, ob die Anzahl der Zeichen in String mit einer bestimmten Anzahl übereinstimmt ...
In Java 10, wenn Gradle Eclipse abgeschlossen ist und JavaSE-1.10 herauskommt, ...
Vergleich von Versionszeichenfolgen, wenn Sie die Verarbeitung zwischen zwei Versionen verzweigen möchten (Java-Implementierung)
Multithreaded passend zur [Java] Vorlage
So schreiben Sie, wenn Sie Zeilenumbrüche und Ausgaben beibehalten und XSS in Rails vermeiden möchten
Lesen Sie CSV in Java (Super CSV Annotation)
Wie man JAVA in 7 Tagen lernt
Wenn Sie die übergeordnete Klasse in Lomboks @builder aufnehmen möchten
Wenn Sie die Java-Entwicklungsumgebung von Eclipse aus ändern möchten
Protokollausgabe in Datei in Java
Wie schreibe ich, wenn ich mit "C language string array" wie argv [] in Ruby-FFI umgehen möchte?
Einstellung, die in bind.pry konvertiert wird, wenn Sie pry in VScode eingeben
Was tun, wenn Sie die Quellposition wissen möchten, an der die Methode in bind.pry definiert ist?
Ich habe eine Anmerkung in Java gemacht.
Wie verwende ich Klassen in Java?
So benennen Sie Variablen in Java
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten
So beheben Sie den unbekannten Fehler, der bei der Verwendung von slf4j in Java aufgetreten ist
Versuchen Sie, Yuma in Java zu implementieren