• 주석이라는 의미
  • 자바 5버전부터 추가된 메타데이터의 일종
  • 클래스 파일에 임베디드되어 컴파일러에 의해 생성 된 후 JVM에 포함되어 동작한다

메타 어노테이션

1. @Retention

  • 어노테이션이 유지되는 시간을 지정

  • RetentionPolicy.SOURCE : 소스파일(.java)까지만 유지 (=컴파일에는 이후 제거된다)
  • RetentionPolicy.CLASS : 클래스파일(.class)까지만 유지 (=실행되면 제거된다)
  • RetentionPolicy.RUNTIME : 런타임때도 JVM에 의해 계속 참조가능

2. @Target

  • 어노테이션 적용 대상을 지정

  • ElementType.PACKAGE
  • ElementType.TYPE : 클래스, 인터페이스, 이넘
  • ElementType.ANNOTATION_TYPE : 어노테이션
  • ElementType.CONSTRUCTOR
  • ElementType.FIELD
  • ElementType.LOCAL_VARIABLE
  • ElementType.METHOD
  • ElementType.PARAMETER
  • ElementType.TYPE_PARAMETER
  • ElementType.TYPE_USE

3. @Documented

  • Javadoc에 작성한 문서를 포함시킬 때 사용

4. @Inherited

  • 자식 클래스가 어노테이션을 상속 받을 때 사용

5.@Repeatable

  • 반복적으로 어노테이션을 선언할 수 있다

ex) RequestMapping

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {		// 인터페이스 어노테이션 정의
    String name() default "";

    @AliasFor("path")
    String[] value() default {};

    @AliasFor("value")
    String[] path() default {};

    RequestMethod[] method() default {};

    ...
}

public static void main(String[] args) {
    @RequestMapping(value="main", method="get")		// 어노테이션 호출
}

커스텀 어노테이션

public @interface Name{
    타입 요소 이름(); 
    ...
}

●Reflection

 - 실행중인 프로그램이 자신의 구조, 동작을 검사, 조사, 수정 하는 것.

 - 객체지향 프로그래밍 언어에서 reflection을 사용하면 컴파일할 때 인터페이스, 필드, 메서드의 이름을 알지 못해도 실행 중인 클래스, 인터페이스, 필드 및 메소드에 접근할 수 있음

 - 새로운 객체의 인스턴스화 및 메소드 호출을 허용

 - 보통의 어노테이션은 동작을 하지 않는 주석일 뿐이지만 reflection을 사용하면 어노테이션 적용 여부와 엘리먼트 값을 읽고 처리할 수 있음