다음과 같이 정의된 주석이 있는 컴파일된 클래스를 고려하세요.
@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 중국어 웹사이트의 기타 관련 기사를 참조하세요!