03. Annotation
2020. 1. 13. 18:27ㆍCSE/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 |