03. Annotation

2020. 1. 13. 18:27CSE/JAVA

* Metadata(메타데이터)

: 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일 하고 처리할지 알려줌

 

* Annotation(어노테이션)

: 메타데이터라고 볼 수 있음

 

public @interface AnnotationName{
	//어노테이션 정의
    //public @interface 이름
    
	String elementName1();			//타입 elementName()
    int elementName2() default 5;	//타입 elementName() default 값
    //기본 element 선언
}

 

* 어노테이션 적용 대상

ElementType 열거 상수 적용 대상
TYPE 클래스, 인터페이스, 열거 타입
ANNOTATION_TYPE 어노테이션
FIELD 필드
CONSTRUCTOR 생성자
METHOD 메소드
LOCAL_VARIABLE 로컬 변수
PACKAGE 패키지

 

* 리플렉션 (Reflection)

: 런타임에 클래스의 메타 정보를 얻는 기능

리턴 타입 메소드
Field[ ] getFields( )
Constructor[ ] getConstructors( )
Method[ ] getDeclaredMethods( )

 

* 어노테이션 유지 정책

: 어노테이션 정보를 어디까지 유지할 것인지 지정

RetentionPolicy 상수 설명
SOURCE

소스상에서만 정보 유지

=> 소스 코드 분석할 때만 의미있음

CLASS

바이트 코드 파일까지 정보 유지

But 리플렉션 이용해서 정보를 얻을 수는 없음

RUNTIME

바이트 코드까지 정보 유지 & 리플렉션 이용 가능

 

 

@Target({ElementType.METHOD})		//Annotation 적용 대상 설정 => 메소드
@Retention(RetentionPolicy.RUNTIME)	//Annotation 유지 정책 => 런타임
public @interface PrintAnnotation{	//Annotation 정의
	String value() default "-";	
    int number() default 15;	
    //element 선언
}

public class Service{
	@PrintAnnotation
    public void method1(){
    	System.out.println("1번 메소드");
    }
    
    @PrintAnnotation("*")	//PrintAnnotation의 value값 설정 => *
    public void method2(){
    	System.out.println("2번 메소드(value = "*")");
   	}
    
    @PrintAnnotation(value = "#", number = 20) //PrintAnnotation의 value,number 값 설정
    public void method3(){
    	System.out.println("3번 메소드(value = "#", number = 20)");
    }
}


public class PrintAnnotationExample{
	public static void main(String[] args){
    	Method[] declaredMethods = Service.class.getDeclareMethods();
        //Reflection => 메소드 얻기
        
        for(Method method : declaredMethods){
        	if(method.isAnnotationPresent(PrintAnnotation.class)){
            	PrintAnnotation printAnnotation = method.getAnnotation(PrintAnnotation.class);
            	//Reflection => 객체 얻기
                
                System.out.println("["+method.getName() + "]");
                System.out.println("value : " + printAnnotation.value());
                System.out.println("number : " + printAnnotation.number());
                
           	}
      	}
  	}
}

'CSE > JAVA' 카테고리의 다른 글

06. Exception  (0) 2020.01.20
05. Anonymous Inner Class  (0) 2020.01.19
04. Nested Class, Nested Interface  (0) 2020.01.19
02. Singleton, Final  (0) 2020.01.12
01. Static  (0) 2020.01.08