메타 어노테이션
- 메타 어노테이션은 '어노테이션을 위한 어노테이션'
- 메타 어노테이션은 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이어야 함.
}
'하.. > java' 카테고리의 다른 글
| ch13 데몬 스레드, 스레드의 상태 (0) | 2021.12.25 |
|---|---|
| ch12 어노테이션 타입 정의하기 어노테이션의 요소 (0) | 2021.12.25 |
| ch12 표준 어노테이션 (0) | 2021.12.25 |
| ch12 어노테이션이란? (0) | 2021.12.25 |
| ch12 열거형에 멤버 추가하기 (0) | 2021.12.25 |