ホームページ >Java >&#&チュートリアル >Java で実行時にカスタム アノテーション値を変更するにはどうすればよいですか?
実行時にカスタム アノテーション値を変更する
この質問は、クラスパス内に存在するコンパイル済みクラスのアノテーション文字列パラメーターを変更するという課題に対処します。ランタイム。具体的には、元のソース コードに影響を与えることなくパラメータの値を変更することが目標です。
解決策
この課題に対処するために、Java のリフレクション機能とカスタム Java エージェント。
実装
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); } }
使用法
このアプローチを使用するには、起動時にカスタム Java エージェントを JVM に送信します。これは、JVM の起動時に -javaagent オプションを使用して実現できます。
java -javaagent:/path/to/AnnotationModifierAgent.jar your.main.class ...
これで、注釈付きクラスが実行時にロードされると、Java エージェントがそれをインターセプトし、それに応じて注釈値を変更します。
以上がJava で実行時にカスタム アノテーション値を変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。