자바는 클래스와 인터페이스의 메타정보(패키지 정보, 타입정보, 생성자, 필드 메소드 정보 등)를 클래스로 관리한다.
@Override클래스나 메서드 위에 사용할 애노테이션을 붙이거나 직접 커스텀이 가능하다.
애노테이션 정의 시 하나 이상의 엘리먼트 멤버 선언 가능 (어노테이션을 코드에 적용할 때 외부의 값을 입력받을 수 있도록 하는 역할)
public @interface AnnotationName{
String elementName1();//요소
}
@AnnotationName(elmentName1="값");//선언시 @를 붙여서 컴파일러에게 어노테이션이라고 알려준다.
애노테이션 작성 시 여러 요소들이 있다면, 어노테이션 적용 시 요소들의 값을 빠짐없이 지정해주어야 한다.
3. 애노테이션을 이용하여 실행
자바에서 기본으로 제공하는 어노테이션
@Overried, @Deprecated, @SuppressWarnings는 JDK 1.5에 등장 @FuntionalInterface는 JDK1.8에 등장했다.
@Override
@Deprecated
@SuppressWarnings
@SuppressWarnings({"rawtypes","unchecked"})
@FunctionalInterface
함수형 인터페이스 선언 시 어노테이션을 붙여서 함수형 인터페이스를 제대로 선언했는지 확인한다.
애노테이션을 정의 시 어노테이션의 적용대상(target) 및 유지기간(retention)을 지정하는 데 사용하며, java.lang.annotation 패키지에 포함되었다.
애노테이션이 유지되는 기간을 지정하는 데 사용
애노테이션 유지 정책
| Retention Policy | 적용 시점 | 제거 시점 |
|---|---|---|
| SOURCE | 컴파일 시 적용 | 컴파일 후 제거 |
| CLASS | 메모리 로딩 시 적용 | 메모리로 로딩 후 제거됨 |
| RUNTIME | 런타임시 까지 어노테이션이 유효하며, 실행 시 리플렉션을 통해 클래스 파일에 저장된 어노테이션 정보를 읽어서 처리된다.실행시 어노테이션 정보가 가상머신에 의해서 참조 가능 | 실행 이후에도 계속 유지됨 |
오버라이드 유지 정책은 SOURCE이므로 소스파일에서만 적용된다.
Annotation 유지정책 테스트
SOURCE, CLASS, RUNTIME 각각 유지정책을 가지는 어노테이션을 생성했다.
@Retention(RetentionPolicy.CLASS)
public @interface ClassRetention {
String value() default "ClassRetention";
}
@Retention(RetentionPolicy.RUNTIME)
public @interface RuntimeRetention {
String value() default "Runtime Retention";
}
@Retention(RetentionPolicy.SOURCE)
public @interface SourceRetention {
String value() default "Source Retention";
}
각각의 어노테이션이 적용된 클래스의 어노테이션 정보를 가져왔다.
public class UserAnnotationSample {
public static void main(String[] args) {
Annotation a[] = new A().getClass().getAnnotations();
Annotation b[] = new B().getClass().getAnnotations();
Annotation c[] = new C().getClass().getAnnotations();
System.out.println("a annotation length = " + a.length);
System.out.println("b annotation length = " + b.length);
System.out.println("c annotation length " + c.length);
System.out.println("c[0] = " + c[0]);
}
}
@SourceRetention
class A {
}
@ClassRetention
class B {
}
@RuntimeRetention
class C {
}
결과를 보면 RUNTIME 유지정책을 택한 어노테이션만이 runtime시 확인 할 수 있었다.
a.length = 0
b.length = 0
c.length = 1
c[0] = @RuntimeRetention(value="Runtime Retention")
애노테이션 적용대상 지정 시 사용
여러 개 타깃으로 지정할 때는 배열 형식으로 작성해야 한다.
@SuppressWarning에 표시된 @Target 어노테이션
애노테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 한다.
@Override , @SuppressWarnings를 제외하고는 모두 @documented 어노테이션이 붙어있다.
| isAnnotationPresent | 지정한 어노테이션이 적용되었는지 여부를 전달 |
|---|---|
| getAnnotation | 지정한 어노테이션이 존재하면 리턴 아닐경우 null |
| getDeclaredAnnotations | 적용된 어노테이션 리턴 |
컴파일 시 끼어들어 특정한 어노테이션이 있는 코드를 참조하여 소스코드를 만들어내는 기능
예시) lombok(어노테이션 설정으로만으로 반복적인 코드 생성을 도와주는 라이브러리)
[참고]
https://medium.com/msolo021015/자바-reflection이란-ee71caf7eec5
자바의 정석 - 어노테이션
www.inflearn.com/course/the-java-code-manipulation#curriculum
https://www.geeksforgeeks.org/java-retention-annotations/
https://madplay.github.io/post/java-reflection