Который уже скомпилирован (я не могу контролировать исходный код) и является частью пути к классу при запуске jvm. Я хотел бы иметь возможность изменять "некоторое значение" на что-то другое во время выполнения, чтобы любое последующее отражение имело мое новое значение вместо значения по умолчанию "некоторое значение".
Возможно ли это? Если да, то каким образом?
Переведено автоматически
Ответ 1
Предупреждение: не тестировалось в OSX - см. Комментарий от @Marcel
Протестировано в OSX. Работает нормально.
Поскольку у меня также возникла необходимость изменять значения аннотации во время выполнения, я вернулся к этому вопросу.
Вот модифицированная версия подхода @assylias (большое спасибо за вдохновение).
/** * Changes the annotation value for the given key of the given annotation to newValue and returns * the previous value. */ @SuppressWarnings("unchecked") publicstatic Object changeAnnotationValue(Annotation annotation, String key, Object newValue){ Objecthandler= Proxy.getInvocationHandler(annotation); Field f; try { f = handler.getClass().getDeclaredField("memberValues"); } catch (NoSuchFieldException | SecurityException e) { thrownewIllegalStateException(e); } f.setAccessible(true); Map<String, Object> memberValues; try { memberValues = (Map<String, Object>) f.get(handler); } catch (IllegalArgumentException | IllegalAccessException e) { thrownewIllegalStateException(e); } ObjectoldValue= memberValues.get(key); if (oldValue == null || oldValue.getClass() != newValue.getClass()) { thrownewIllegalArgumentException(); } memberValues.put(key,newValue); return oldValue; }
Преимущество этого подхода в том, что не нужно создавать новый экземпляр аннотации. Следовательно, не нужно заранее знать конкретный класс аннотации. Также побочные эффекты должны быть минимальными, поскольку исходный экземпляр аннотации остается нетронутым.
Протестировано с Java 8.
Ответ 2
Этот код выполняет более или менее то, что вы просите - это простое подтверждение концепции:
правильная реализация должна также учитывать declaredAnnotations
если реализация аннотаций в Class.java изменится, код сломается (т. Е. Он может сломаться в любой момент в будущем)
Я понятия не имею, есть ли побочные эффекты...
Вывод:
oldAnnotation = некоторое значение modifiedAnnotation = другое значение
Этот параметр работает на моей машине с Java 8. Он изменяет значение ignoreUnknown в аннотации @JsonIgnoreProperties(ignoreUnknown = true) с true на false.
final List<Annotation> matchedAnnotation = Arrays.stream(SomeClass.class.getAnnotations()).filter(annotation -> annotation.annotationType().equals(JsonIgnoreProperties.class)).collect(Collectors.toList());
SPRING может выполнить эту работу очень легко, это может быть полезно разработчику spring . выполните следующие действия :-
Первое решение:- 1) создайте компонент, возвращающий значение для SomeProperty . Здесь я ввел значение SomeProperty с аннотацией @Value из базы данных или файла свойств :-