1) 표준(내장) 어노테이션
: 주로 컴파일러에게 유용한 정보를 제공하기 위한 어노테이션
: 메타 어노테이션을 제외한 일반적인 어노테이션
: @Override, @SuppressWarnings, @Deprecated
@Repeatable(1.7) @FunctionalInterface(1.7)등
2) 메타어노테이션
: 어노테이션을 위한 어노테이션, 즉 어노테이션을 정의할 때 사용함.
: @Documented, @Target, @Retention, @Inherited 등
@interface 어노테이션이름{
int id = 100; // 상수 선언 가능
타입요소이름(); // 반환값이 있고 매개변수는 없는 추상메서드 형태
}
1) 요소의 타입은 기본형, String, enum, annotation, class만 허용된다.
2) ()안에 매개변수를 선언할 수 없다.
3) 예외를 선언할 수 없다.
4) 요소의 타입에 타입 매개변수(제너릭타입문자)를 사용할 수 없다.
=>메타 어노테이션 (ex) PrintAnntation
@Target(ElementType.METHOD)// annotation이 적용가능한 대상을 지정함 -> Method에 붙이는 annotation
@Retention(RetentionPolicy.RUNTIME)//annotation이 유지되는 기간(SOURCE,CLASS가 기본값)
public @interface PrintAnnotation{ //interface앞에 @붙이면 annotation
int id = 100; // 상수선언 가능. static final int id = 100;
String value() default "+"; //기본값을 '+'로 지정
int count() default 20; // 기본값을 20으로 지정
}
=> Service창
package kr.or.ddit.basic;
//200918 (PrintAnnotation)어노테이션 붙일수 있는 클래스
public class Service {
@PrintAnnotation // 타겟을 메서드로 해놔서 메서드 위에 어노테이션 붙인거임
public void method1() {
System.out.println("메서드1에서 출력되었습니다.");
}
@PrintAnnotation(value = "%") // value타입의(%) 값이 하나가 있으면 value가 생략된다.
public void method2() {
System.out.println("메서드2에서 출력되었습니다.");
}
@PrintAnnotation(value="#", count=25) // 다른타입의 요소가 있는 것은 value 생략 불가능
public void method3() {
System.out.println("메서드3에서 출력되었습니다.");
}
}
main메서드
public class AnnotationTest {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
// PrintAnnotaion의 static 변수값 출력
System.out.println(PrintAnnotation.id); //100 PrintAnnotation에서 100으로 선언해놓음
//reflection 기능을 이용한 메서드 실행하기
//선언된 메서드 목록 가져오기
Method[] declaredMethods = Service.class.getDeclaredMethods();
for(Method m : declaredMethods) {
System.out.print(m.getName()); //메서드명 출력 //count() -> PrintAnnotation에서 20으로 default 해놓음
for(int i=0; i<m.getDeclaredAnnotation(PrintAnnotation.class).count(); i++) {
System.out.print(m.getAnnotation(PrintAnnotation.class).value());//value값 출력: %, #
}
System.out.println();//줄바꿈 처리
//방법1 - 주석해놓고 방법2 실행해도 되고
//m.invoke(new Service()); // reflection기능 이용한 메서드 실행 // throws Exception
//방법2 - 주석해놓고 방법1 실행해도 됨
Class<Service> klass = Service.class;
Service service = (Service)klass.newInstance(); //throws Exception
m.invoke(service);
}
}
}
콘솔창=>
reflection 정리도 참고