[Java] 4. Annotation
Annotation
사전적의미로 ‘주석’이란 의미를 갖고있고, 자바 소스 코드에 메타 코드를 부여하는 용도로 사용된다.
클래스, 메소드, 변수, 패키지 등에 annotation 을 추가할 수 있고, annotation은 컴파일러에 의해 생성된는 .class파일에서 JVM이 실행될 때, annotation은 reflection을 사용해 읽어들인다.
Built in Annotation
자바에서 제공하는 기본 어노테이션
- @Override : 메서드가 오버라이드 됐는지 검증
- @Deprecated
- @SuppressWarnings
- @SafeVarargs
- @FunctionalInterface : 람다 함수를 위한 인터페이스를 지정
Meta Annotation
커스텀 어노테이션을 만들때 사용하는 어노테이션
@Retention : 어노테이션의 범위
- @Retention(RetentionPolicy.RUNTIME) : 런타임시점에 JVM에 의해 참조 가능
- @Retention(RetentionPolicy.CLASS) : 클래스를 참조할 때까지 참조 가능
- @Retention(RetentionPolicy.SOURCE) : 컴파일 이후 참조 불가능
@Documented : 문서에 어노테이션의 정보를 표현
@Target : 어노테이션이 적용될 위치
- @Target(ElementType.PACKAGE) : 패키지
- @Target(ElementType.TYPE) : 클래스
- @Target(ElementType.CONSTRUCTOR) : 생성자
- @Target(ElementType.FIELD) : 멤버 필드
- @Target(ElementType.METHOD) : 메서드
- @Target(ElementType.ANNOTATION_TYPE) : 어노테이션 타입
- @Target(ElementType.LOCAL_VARIABLE) : 지역 변수
- @Target(ElementType.PARAMETER) : 매개 변수
@Inherited : 자식클래스가 어노테이션을 상속받음
@Repeatable : 반복적으로 어노테이션을 선언 할 수 있음
Custom Annotation
@interface 키워드를 사용해 커스텀 어노테이션을 작성한다.
어노테이션은 Element를 멤버로 가질 수 있고, Element는 타입과 이름으로 구성되며 디폴트 값을 가지고 있다.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String test() default "test"
}
예제
pubilc class Test() {
@MyAnnotation(test = "hello")
public void test() {
}
}
요런식으로 어노테이션의 값을 가져올 수 있다.
public void run() {
Method[] methods = Test.class.getDeclaredMethods();
for (var method : methods) {
if (method.isAnnotationPresent(TestAnnotation.class)) {
System.out.println(method.getName());
TestAnnotation testAnnotation = method.getAnnotation(TestAnnotation.class);
System.out.println(testAnnotation.test());
}
}
}