JAVA - 메타 애너테이션

2020. 9. 26. 11:35개인공부/java

메타 애너테이션 

- 메타 애너테이션은 '애너테이션을 위한 애너테이션'

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

 

@Target

-애너테이션을 정의할 때, 적용대상 지정에 사용

 

@Target으로 지정할수 있는 애너테이션 적용대상의 종류

 

@Target({FIELD, TYPE, TYPE_USE})

@interface MyAnnotation {} // 애너테이션을 정의

 

@Retention

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

class는 잘 안씀.

 

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

@Target(ElementType.MEHOTD)

@Retention(RetentionPolicy.SOURCE) // 컴파일러가 읽어낸다음은 필요가 없기때문에 클래스파일에서 빠진다. 소스 파일에만 존재함.

public @interface Override{}

 

-실행시에 사용 가능한 애너테이션의 정책은 RUNTIME이다.

@Documented

@Retention(RetentionPolicy.RUNTIME) // Runtime까지, 클래스 파일에 존재한다. 실행시에 사용가능함

@Target(ElementType.TYPE)
public @interface FunctionalInterface{}

 

 

@Documented

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

 

@Inherited

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

 

@ Inherited  //상속

@interface SuperAnno{}  // @SuperAnno가 자손까지 영향 미치게함.

 

@SuperAnno

class parent{}

 

Class Child extends Parent{} // Child에 애너테이션이 붙은 것으로 인식함.

 

@Repeatable

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

@Repeatable(Todos.class) // ToDo애너테이션을 여러 번 반복해서 쓸 수 있게 한다.

@interface ToDo{

   String value();

}

 

-@Repeatable이 붙은 애너테이션은 반복해서 붙일 수 있다.

@ToDo("delete test codes.")

@ToDo("override inherited methods")

class MyClass{

.....

}

 

-@Repeatalbe인 @ToDo를 하나로 묶을 컨테이너 애너테이션도 정의해야 함.

@interface ToDos{   // 여러개의 ToDo 애너테이션을 담을 컨테이너 애너테이션 ToDos

    ToDo[] value();      // ToDo 애너테이션 배열타입의 요소를 선언. 이름이 반드시 value 이어야함

}

 

 

 

출저 : 자바의 정석 - 남궁성 저자님.

'개인공부 > java' 카테고리의 다른 글

JAVA - stream  (0) 2020.09.27
JAVA - 함수형 인터페이스  (0) 2020.09.26
JAVA - 표준 애너테이션  (0) 2020.09.26
JAVA -애너테이션  (0) 2020.09.25
자바 지네릭스 - 2020.07.24  (0) 2020.07.25