Annotation

배세훈·2021년 12월 22일
0

java

목록 보기
11/16

Annotation 종류

  1. built-in 어노테이션
  • Java 코드에 적용되는 어노테이션
  • @Override, @Deprecated, @SuppressWarnings 등이 존재
  1. meta 어노테이션
  • 다른 어노테이션에 적용되기 위한 어노테이션
  • @Retention, @Documented, @Target, @Inherited, @Repeatable 등이 존재

Meta 어노테이션 종류

  1. @Retention
  • 해당 어노테이션의 정보를 어느 범위까지 유지할 것인지를 설정함

  • RetentionPolicy.SOURCE: 컴파일 전까지만 유효하며 컴파일 이후에는 사라짐

  • RetentionPolicy.CLASS: 컴파일러가 클래스를 참조할 때까지 유효함

  • RetentionPolicy.RUNTIME: Reflection을 사용하여 컴파일 이후에도 JVM에 의해 계속 참조가 가능함

  1. @Documented
  • JavaDoc 생성시 Document에 포함되도록 함
  1. @Target
  • 해당 어노테이션이 사용되는 위치를 결정함

  • ElementType.PACKAGE: 패키지 선언시

  • ElementType.TYPE: 타입 선언시

  • ElementType.CONSTRUCTOR: 생성자 선언시

  • ElementType.FIELD: 멤버변수 선언시

  • ElementType.METHOD: 메소드 선언시

  • ElementType.ANNOTATION_TYPE: 어노테이션 타입 선언시

  • ElementType.LOCAL_VARIABLE: 지역변수 선언시

  • ElementType.TYPE_PARAMETER: 매개변수 타입 선언시

  1. @Inherited
  • 해당 어노테이션을 하위 클래스에 적용함
  1. @Repeatable
  • Java8부터 지원, 연속적으로 어노테이션을 선언하는 것을 허용함

커스텀 Annotation 생성

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();
        
    }
}
profile
성장형 인간

0개의 댓글