История вопроса:
Аннотации появились в Java 5, чтобы добавить метаинформацию в байткод без изменения самой логики программы. С помощью аннотаций легко снабжать классы и методы дополнительной информацией для фреймворков, компиляторов или парсеров.
Проблема:
Плохо спроектированные или неправильно использованные аннотации приводят к усложнению поддержки кода. Иногда разработчики путают применимость аннотаций или не понимают, как делать свои собственные, и не знают о возможности делать аннотации с параметрами.
Решение:
Создание собственной аннотации:
import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyTest { String value() default ""; }
Использование аннотации:
public class TestClass { @MyTest("Example") public void testMethod() {...} }
Ключевые особенности:
Может аннотация наследоваться от другой аннотации?
Ответ: Нет, аннотации в Java не поддерживают наследование между собой.
Можно ли сделать работу аннотации обязаловкой во всех наследниках класса?
Ответ: Не напрямую. Нужно дополнительно проверять наличие аннотации рефлексией, вручную реализуя подобный контроль.
Чем @Retention(Class) отличается от @Retention(RUNTIME)?
Ответ:
В проекте решили заменить конфигурацию через xml на аннотации, но не добавили @Retention(RUNTIME)
Плюсы:
Минусы:
Настроили кастомную аннотацию @Audit у методов, контролирующую аудит бизнес-операций, с рефлексией реального вызова логики на сервере.
Плюсы:
Минусы: