プリコンパイルされたクラスがインポートされ、クラスパスの一部であるシナリオでは、実行時に注釈文字列パラメータを変更することが望ましい場合があります。この記事では、これを実現するために考えられるアプローチを検討します。
特定のアノテーションの特定のキーのアノテーション値を変更するには、以下の手順に従います。
次を使用してアノテーションの呼び出しハンドラーを取得します。 Proxy.getInvocationHandler(annotation):
Object handler = Proxy.getInvocationHandler(annotation);
宣言されたフィールドにアクセスし、そのアクセシビリティを true に設定することにより、ハンドラーから memberValues フィールドを取得します:
Field f = handler.getClass().getDeclaredField("memberValues"); f.setAccessible(true);
memberValues をmap:
Map<String, Object> memberValues = (Map<String, Object>) f.get(handler);
キーを使用してマップから古い値を取得します:
Object oldValue = memberValues.get(key);
新しい値でマップを更新します:
memberValues.put(key, newValue);
次のアノテーション付きクラスについて考えます。
@ClassAnnotation("class test") public static class TestClass { @FieldAnnotation("field test") public Object field; @MethodAnnotation("method test") public void method() {} }
実行時にアノテーション値を変更するには、次のコードを使用します。
Field field = TestClass.class.getField("field"); final FieldAnnotation fieldAnnotation = field.getAnnotation(FieldAnnotation.class); System.out.println("old FieldAnnotation = " + fieldAnnotation.value()); changeAnnotationValue(fieldAnnotation, "value", "another field annotation value"); System.out.println("modified FieldAnnotation = " + fieldAnnotation.value());
このアプローチにより、動的に新しいアノテーション インスタンスを作成せずにアノテーション パラメータを変更できるため、具体的なアノテーション クラスについての事前知識の必要性が軽減されます。
以上が実行時にクラス定義のアノテーション文字列パラメータを変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。