Maison >Java >javaDidacticiel >Comment puis-je modifier les valeurs d'annotation personnalisées lors de l'exécution en 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é.
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); } }
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!