Какие базовые аннотации существуют в Java, например @Override
Что проверяют
Знаете ли вы встроенные аннотации языка и понимаете ли, что аннотация сама ничего не делает: её читает компилятор, инструмент сборки или код через рефлексию. Следом почти всегда спрашивают про @Retention и про то, как написать свою аннотацию.
Как отвечать
Начните с аннотаций из java.lang, которые понимает сам компилятор:
@Override: метод обязан переопределять метод суперкласса или реализовывать метод интерфейса. Опечатка в имени или сигнатуре становится ошибкой компиляции, а не тихой перегрузкой;@Deprecated: элемент устарел, при его использовании компилятор выдаёт предупреждение. С Java 9 есть атрибутыsinceиforRemoval;@SuppressWarnings: глушит конкретные предупреждения, например"unchecked"или"deprecation". Вешать её стоит на минимальную область;@FunctionalInterface: компилятор проверяет, что в интерфейсе ровно один абстрактный метод;@SafeVarargs: обещание, что метод с generic varargs не делает с массивом ничего опасного.
Затем мета-аннотации из java.lang.annotation, которыми описывают свои аннотации:
@Retention: где аннотация живёт.SOURCEотбрасывается компилятором,CLASSпопадает в байткод, но не видна рефлексии,RUNTIMEдоступна черезgetAnnotation(). По умолчаниюCLASS;@Target: к чему можно применять, напримерMETHOD,FIELD,TYPE;@Inherited,@Documented,@Repeatable: наследование подклассами, попадание в Javadoc и повторное применение к одному элементу.
Хороший финал: @Entity или @Transactional устроены так же, только читает их не компилятор, а фреймворк в рантайме.
Где спотыкаются
Называют @Entity или @Autowired базовыми аннотациями Java. Это JPA и Spring, а не язык, и интервьюер это заметит.
Думают, что @SuppressWarnings снимает обязанность обрабатывать checked-исключения. Она управляет только предупреждениями, ошибку компиляции ею не убрать.
Пишут свою аннотацию без @Retention(RUNTIME) и не понимают, почему рефлексия возвращает null. Сюда же ожидание, что @Inherited сработает для интерфейсов или методов: она действует только на аннотации класса при наследовании от суперкласса.