본문 바로가기

하../java

ch12 메타 어노테이션

메타 어노테이션

- 메타 어노테이션은 '어노테이션을 위한 어노테이션'

- 메타 어노테이션은 java.lang.annotation패키지에 포함

메타어노테이션
어노테이션을 만들때 사용
 
@Target *


애너테이션이 적용 가능한 대상을 지정한다.


@Documented *


애너테이션 정보가 javadoc으로 작성된 문서에 포함되게 한다.


@Inherited *


애너테이션이 자손 클래스에 상속 되도록 한다.


@Retention *


애너테이션이 유지되는 범위를 지정하는데 사용한다.


@Repeatable *


애너테이션을 반복적으로 적용하도록 한다.

@Target

- 어노테이션을 정의할 때 적용대상 지정에 사용

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings{
 String[] value();
}

@Retention

- 어노테이션이 유지(retention)되는 기간을 지정하는데 사용

유지 정책 의미
SOURCE 소스 파일에만 존재 클래스파일에는 존재하지 않음
CLASS 클래스 파일에 존재 실행시에 사용불가 기본값
RUNTIME 클래스 파일에 존재 실행시에 사용가능

- 컴파일러에 의해 사용되는 어노테이션의 유지 정책은 SOURCE이다.

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override{}

- 실행시에 사용 가능한 어노테이션의 정책은 RUNTIME이다

@Documented
@Retention(RetentionPolicy.RUNTIME)//런타임까지
@Target(ElementType.TYPE)
public @interface FunctionalInterface{}

@Documented, @Inherited

- javadoc으로 작성한 문서에 포함시키려면 @Documented를 붙인다

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface{}

- 어노테이션을 자손 클래스에 상속하고자 할 때 @Inherited를 붙인다.

@Inherited //@SuperAnno가 자손까지 영향 미치게
@interface SuperAnno{} //조상 어노테이션

@SuperAnno
class Parent{}

class Child extends Parent{} // Child에 @SupperAnno 어노테이션을 붙은것으로 인식

@Repeatable

-반복해서 붙일 수 있는 어노테이션을 정의할 때 사용

@Repeatable(Todos.class) //Todo어노테이션을 여러 번 반복해서 쓸 수 있게 한다.
@interface ToDo{
 String value();
}
-@Repeatable이 붙은 어노테이션은 반복해서 붙일 수 있다.
@ToDo("delete test codes.")
@ToDo("override inherited methods")
class Myclass{
}
-@Repeatable인 @ToDo를 하나로 묶을 컨테이너 어노테이션도 정의해야함.
@interface ToDos{//여러 개의 ToDo어노테이션을 담을 컨테이너 어노테이션 ToDos
 ToDo[] value(); //ToDo어노테이션 배열타입의 요소를 선언 이름이 반드시 value이어야 함.
}