ホームページ > Java > &#&チュートリアル > 実行時に Java アノテーション パラメータ値を変更できますか?

実行時に Java アノテーション パラメータ値を変更できますか?

Patricia Arquette
リリース: 2024-12-27 00:19:15
オリジナル
154 人が閲覧しました

Can We Modify Java Annotation Parameter Values at Runtime?

実行時にアノテーション パラメータ値を変更する方法

問題ステートメント

次のように定義されたアノテーションを持つコンパイル済みクラスを考えてみましょう:

@Something(someProperty = "some value")
public class Foobar {
    //...
}
ログイン後にコピー

ソースコードを変更せずに、の値を変更できますか? "someProperty" を実行時に別の値に変更します。その後のリフレクションでは、デフォルトの代わりに更新された値が取得されますか?

ソリューション

免責事項: ソリューションは、次のとおりであるとは限りません。すべてのプラットフォームに適用可能 (例: macOS).

アプローチ:

Java のアノテーション反映メカニズムを活用し、内部データを操作することで基礎となるアノテーション値を動的に変更できます。

コード:

/**
 * Modifies the specified annotation's key with the new value and returns the previous value.
 */
@SuppressWarnings("unchecked") // Suppress unchecked type warning for convenience
public static Object changeAnnotationValue(Annotation annotation, String key, Object newValue) {
    Object handler = Proxy.getInvocationHandler(annotation); // Obtain InvocationHandler for the annotation

    Field memberValuesField;
    try {
        memberValuesField = handler.getClass().getDeclaredField("memberValues"); // Fetch "memberValues" field
    } catch (NoSuchFieldException | SecurityException e) {
        throw new IllegalStateException(e);
    }

    memberValuesField.setAccessible(true); // Make field accessible

    Map<String, Object> memberValues;
    try {
        memberValues = (Map<String, Object>) memberValuesField.get(handler); // Obtain member values map
    } catch (IllegalArgumentException | IllegalAccessException e) {
        throw new IllegalStateException(e);
    }

    Object oldValue = memberValues.get(key); // Get the old value

    if (oldValue == null || oldValue.getClass() != newValue.getClass()) { // Ensure type safety
        throw new IllegalArgumentException();
    }

    memberValues.put(key, newValue); // Set the new value
    return oldValue; // Return the old value
}
ログイン後にコピー

使用例:

@ClassAnnotation("class test")
public static class TestClass {
    @FieldAnnotation("field test")
    public Object field;
    @MethodAnnotation("method test")
    public void method() { }
}

public static void main(String[] args) {
    ClassAnnotation classAnnotation = TestClass.class.getAnnotation(ClassAnnotation.class);
    System.out.println("Old ClassAnnotation: " + classAnnotation.value());

    changeAnnotationValue(classAnnotation, "value", "another value");

    System.out.println("Modified ClassAnnotation: " + classAnnotation.value());

    // Modify field and method annotations similarly
}
ログイン後にコピー

利点:

  • 不要新しい注釈インスタンスを作成するには
  • は必要ありません具体的なアノテーション クラスに関する事前知識
  • 元のアノテーション インスタンス上で動作するため、副作用が最小限に抑えられます

以上が実行時に Java アノテーション パラメータ値を変更できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート