Annotation
- 프로그램 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨것
- 주석처럼 프로그래밍 언어에 영향을 미치지 않으면서도 다른 프로그램에게 유용한 정보를 제공함
- 일종의 메타데이터
- JDK1.5부터
종류
표준(내장) 어노테이션
- 메타 어노테이션을 제외한 일반적인 어노테이션
- 주로 컴파일러에게 유용한 정보를 제공하기 위함
- @Override, @SuppressWarnings, @Deprecated, @Repeatable(1.7), @FunctionalInterface(1.7),...
메타 어노테이션
- 어노테이션을 위한 어노테이션
- 어노테이션 정의시 사용
- @Documented, @Target, @Retention, @Inherited,...
장점? 특징?
- 보통 xml 설정파일을 프로그램 구동되는 시점에 읽음
- xml 파일 내용: 이런 객체 만들어야함. 어쩌구저쩌구. 시키는 내용들
- 그 파일이 시키는대로 프로그램이 돌음
- 하지만 xml없어도 어노테이션있으면 그걸로 프로그램 돌 수 있음
작성 방법
@interface 어노테이션이름 {
반환타입 타입요소이름();
...
}
작성 규칙
- 요소의 타입은 기본형, String, enum, annotation, class만 허용
- ()안에 매개변수를 선언할 수 없다.
- 예외를 선언할 수 없다.
- 요소의 타입에 타입 매개변수(제너릭타입문자)를 사용할 수 없다.
예시
1단계: 어노테이션 작성
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PrintAnnotation {
int id = 100;
String value() default "-";
int count() default 20;
}
2단계: 메서드 모아놓은 Service 클래스
public class Service {
@PrintAnnotation
public void method1() {
System.out.println("메서드1에서 출력되었습니다람쥐.");
}
@PrintAnnotation("%")
public void method2() {
System.out.println("메서드2에서 출력되었습니다람쥐.");
}
@PrintAnnotation(value = "#", count = 25)
public void method3() {
System.out.println("메서드3에서 출력되었습니다람쥐.");
}
}
3단계: 실행
public class AnnotationTest {
public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
Method[] declaredMethods = Service.class.getDeclaredMethods();
for (Method m : declaredMethods) {
System.out.println(m.getName());
for (int i = 0; i < m.getDeclaredAnnotation(PrintAnnotation.class).count(); i++) {
System.out.print(m.getDeclaredAnnotation(PrintAnnotation.class).value());
}
System.out.println();
Class<Service> klass = Service.class;
Service service = (Service) klass.newInstance();
m.invoke(service);
}
}
}