Кроме того, они уникальны для Java, есть эквивалент C ++?
Нет, но VB и C # имеют атрибуты , которые то же самое.
Их использование весьма разнообразно. Один из типичных примеров Java, @Override
не оказывает никакого влияния на код , но он может быть использован компилятором , чтобы сгенерировать предупреждение (или ошибку) , если декорированный метод не переопределить другой метод. Точно так же методы могут быть отмечены устаревшими.
Тогда есть отражение. Когда вы размышляете тип класса в вашем коде, вы можете получить доступ к атрибутам и действовать в соответствии с информацией , найденной там. Я не знаю ни одного примера в Java , но в .NET это используется компилятором для генерации (де) сериализаций информации для классов, определить расположение памяти структур и объявить импорт функций из устаревших библиотек ( в том числе). Они также контролируют , как работает форма IDE дизайнер.
/ EDIT: Атрибуты классов сопоставимы помечать интерфейсы (например , Сериализуемый в Java). Тем не менее, принципы .NET кодирования говорят , не использовать интерфейсы тегов. Кроме того , они работают только на уровне класса, а не на уровне методы.