Подтвердить что ты не робот

Что означают константы ElementType в аннотациях Java?

java.lang.annotation.ElementType:

Тип элемента программы. Константы этого перечисляемого типа обеспечивают простую классификацию объявленных элементов в программе Java. Эти константы используются с мета-аннотацией Target, чтобы указать, где законно использовать тип аннотации.

Существуют следующие константы:

  • ANNOTATION_TYPE - объявление типа аннотации
  • КОНСТРУКТОР - объявление конструктора
  • FIELD - объявление поля (включает константы перечисления)
  • LOCAL_VARIABLE - объявление локальной переменной
  • МЕТОД - Объявление метода
  • ПАКЕТ - объявление пакета
  • ПАРАМЕТР - Объявление параметра
  • ТИП - класс, интерфейс (включая тип аннотации) или объявление перечисления

Может кто-нибудь объяснить, что у каждого из них (где они будут аннотированы в реальном коде)?

4b9b3361

Ответ 1

Это обобщает основные из них:

@BlahType
public class MyAnnotatedClass {
  @BlahField
  private String foo;

  @BlahConstructor
  public MyAnnotatedClass() {
  }

  @BlahMethod
  public String bar(@BlahParameter String str) {
    @BlahLocalVariable String asdf = "asdf";
    return asdf + str;
  }
}

Затем ANNOTATION_TYPE находится только в определении аннотации, а пакет указан в файле package-info.java в пакете, см. здесь.

Ответ 2

Скажем, аннотация, на которую вы указываете ElementType, называется YourAnnotation:

  • ANNOTATION_TYPE - объявление типа аннотации. Примечание: Это относится к другим аннотациям

    @YourAnnotation
    public @interface AnotherAnnotation {..}
    
  • CONSTRUCTOR - объявление конструктора

    public class SomeClass {
        @YourAnnotation
        public SomeClass() {..}
    }
    
  • FIELD - объявление поля (включает константы перечисления)

    @YourAnnotation
    private String someField;
    
  • LOCAL_VARIABLE - объявление локальной переменной. Примечание.. Это невозможно прочитать во время выполнения, поэтому оно используется только для вещей времени компиляции, таких как аннотация @SuppressWarnings.

    public void someMethod() {
        @YourAnnotation int a = 0;
    }
    
  • МЕТОД - Объявление метода

    @YourAnnotation
    public void someMethod() {..}
    
  • ПАКЕТ - объявление пакета. Примечание: Это можно использовать только в package-info.java.

    @YourAnnotation
    package org.yourcompany.somepackage;
    
  • ПАРАМЕТР - Объявление параметра

    public void someMethod(@YourAnnotation param) {..}
    
  • TYPE - класс, интерфейс (включая тип аннотации) или объявление перечисления

    @YourAnnotation
    public class SomeClass {..}
    

Вы можете указать несколько ElementType для данной аннотации. Например:.

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD})

Ответ 3

TYPE

Аннотация:

@Target({ElementType.TYPE})    // This annotation can only be applied to
public @interface Tweezable {  // class, interface, or enum declarations.
}

и пример использования:

@Tweezable
public class Hair {
    ...
}