해당 어노테이션의 정보를 어느 범위까지 유지할 것인지를 설정함
RetentionPolicy.SOURCE: 컴파일 전까지만 유효하며 컴파일 이후에는 사라짐
RetentionPolicy.CLASS: 컴파일러가 클래스를 참조할 때까지 유효함
RetentionPolicy.RUNTIME: Reflection을 사용하여 컴파일 이후에도 JVM에 의해 계속 참조가 가능함
해당 어노테이션이 사용되는 위치를 결정함
ElementType.PACKAGE: 패키지 선언시
ElementType.TYPE: 타입 선언시
ElementType.CONSTRUCTOR: 생성자 선언시
ElementType.FIELD: 멤버변수 선언시
ElementType.METHOD: 메소드 선언시
ElementType.ANNOTATION_TYPE: 어노테이션 타입 선언시
ElementType.LOCAL_VARIABLE: 지역변수 선언시
ElementType.TYPE_PARAMETER: 매개변수 타입 선언시
MsgSender Annotation 생성
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Component
public @interface MsgSender{
MsgTypte type();
String subType() default "";
}
@MsgSender reflection 예제
ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
scanner.addIncludeFilter(new AnnotationTypeFilter(MsgSender.class));
for(BeanDefinition bd : scanner.findCandidateComponents("com.example.an")){
String beanName = bd.getBeanClassName();
Class c = Class.forName(beanName);
Annotation an = c.getAnnotation(MsgSender.class);
if(an != null && an.annotationType() == MsgSender.class){
MsgSender senderAn = (MsgSender) an;
MsgType type = senderAn.type();
String subType = senderAn.subType();
}
}