> Java > 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿