recherche
MaisonJavajavaDidacticielComment puis-je modifier les valeurs d'annotation personnalisées lors de l'exécution en Java ?

How Can I Modify Custom Annotation Values at Runtime in Java?

Modification des valeurs d'annotation personnalisées au moment de l'exécution

Cette question aborde le défi de la modification des paramètres de chaîne d'annotation pour une classe compilée qui existe dans le chemin de classe à exécution. Plus précisément, l'objectif est de modifier la valeur d'un paramètre sans affecter le code source d'origine.

Solution

Pour relever ce défi, nous exploitons les capacités de réflexion de Java et un agent Java personnalisé.

  1. Java Reflection : Grâce à la réflexion, nous pouvons accéder aux valeurs d'annotation au moment de l'exécution. Plus précisément, nous utilisons la méthode Proxy.getInvocationHandler pour obtenir le gestionnaire de l'instance d'annotation, puis les champs handler.getClass() et memberValues ​​pour accéder aux valeurs réelles.
  2. Agent Java personnalisé : Pour modifier la valeur de l'annotation, un agent Java personnalisé est requis. Cet agent s'attache dynamiquement à la JVM en cours d'exécution, nous permettant d'intercepter le chargement des classes, y compris la classe annotée, et de modifier la valeur de l'annotation pendant le processus de chargement.

Implémentation

import java.lang.annotation.Annotation;
import java.lang.instrument.Instrumentation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.Map;

public class AnnotationModifierAgent {

    public static void premain(String agentArgs, Instrumentation inst) {
        inst.addTransformer((loader, className, classBeingRedefined, protectionDomain, classfileBuffer) -> {
            if (className.equals("your.package.Foobar")) {
                Class> foobarClass = loader.loadClass(className);
                Annotation[] annotations = foobarClass.getAnnotations();
                for (Annotation annotation : annotations) {
                    try {
                        modifyAnnotationValue(annotation, "someProperty", "new value");
                    } catch (NoSuchFieldException | IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }

            return classfileBuffer;
        });
    }

    @SuppressWarnings("unchecked")
    public static void modifyAnnotationValue(Annotation annotation, String key, Object newValue) throws NoSuchFieldException, IllegalAccessException {
        InvocationHandler handler = Proxy.getInvocationHandler(annotation);
        Field f = handler.getClass().getDeclaredField("memberValues");
        f.setAccessible(true);
        Map<string object> memberValues = (Map<string object>) f.get(handler);
        memberValues.put(key, newValue);
    }
}</string></string>

Utilisation

Pour utiliser cette approche, vous devez joindre le fichier personnalisé Agent Java à la JVM lors de son démarrage. Ceci peut être réalisé en utilisant l'option -javaagent lors du lancement de la JVM.

java -javaagent:/path/to/AnnotationModifierAgent.jar your.main.class ...

Désormais, lorsque la classe annotée est chargée au moment de l'exécution, l'agent Java l'interceptera et modifiera la valeur d'annotation en conséquence.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Outils chauds

MinGW - GNU minimaliste pour Windows

MinGW - GNU minimaliste pour Windows

Ce projet est en cours de migration vers osdn.net/projects/mingw, vous pouvez continuer à nous suivre là-bas. MinGW : un port Windows natif de GNU Compiler Collection (GCC), des bibliothèques d'importation et des fichiers d'en-tête librement distribuables pour la création d'applications Windows natives ; inclut des extensions du runtime MSVC pour prendre en charge la fonctionnalité C99. Tous les logiciels MinGW peuvent fonctionner sur les plates-formes Windows 64 bits.

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Version crackée d'EditPlus en chinois

Version crackée d'EditPlus en chinois

Petite taille, coloration syntaxique, ne prend pas en charge la fonction d'invite de code

Télécharger la version Mac de l'éditeur Atom

Télécharger la version Mac de l'éditeur Atom

L'éditeur open source le plus populaire

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP