개념
*애노테이션(Annotation)
; 일명 메타 데이터, JDK5에 포함
*용도
1) 컴파일러에 정보를 알려준다
2) 컴파일할때와 설치시의 작업을 지정한다
3) 실행할 때 별도의 처리가 필요할 때
4) 환경설정 파일을 대신할 때
*java standard version
@Override : 인터페이스, 추상클래스 상속시
@Deprecated : 더이상 유효하지 않은, 사용 안 했으면
@SuppressWarnings : error(무조건 고쳐야 실행됨), warning(실행은 되지만 위험성을 경고)
*java Enterprise edition
@WebServlet
...
@Target.키워드 (적용대상)
- TYPE : 클래스/인터페이스/열거형
- ANNOTATOIN_TYPE : 어노테이션
- FIELD : 필드
- CONSTRUCTOR : 생성자
- METHOD : 매서드
- LOCAL_VARIABLE : 로컬 변수
- PACKAGE : 패키지
*애노테이션 유지정책
;애노테이션 정보가 언제까지 살아있는가?
@Rentention(RententionPolicy.키워드)
- SOURCE : 소스상에서만 어노테이션 정보 유지
- CLASS : 바이트 코드 파일까지 어노테이션 정보 유지
- RUNTIME : 실행할 때 Reflection API 정보를 얻을 수 있다
*리플렉션 API를 통해 현재 실행중인 프로그램의 필드,생성자,매서드,클래스 등등의 정보를 얻을 수 있다
- Field[] getFields() : 필드정보를 Filed 배열로 리턴
- Constructor[] getConstructor() : 생성자 정보를 Constructor 배열로 리턴
- Method[] getDeclareMethod() : 매서드 정보를 Method 배열로 리턴
*다양한 내장 매서드
- boolean isAnnotationPresentation(Class<? extends Annotation> annotationClass)
: 지정한 어노테이션이 적용되었는지 여부를 반환
- Annotation getAnnotation(Class annotationClass)
: 지정한 어노테이션이 적용되어 있으면 어노테이션을 리턴하고, 그렇지 않으면 null을 리턴한다
- Annotation[ ] getAnnotation()
: 적용된 모든 어노테이션을 리턴한다
- Annotation[ ] getDeclaredAnnotations()
: 직접 적용된 모든 어노테이션을 리턴한다
예제
1) 어노테이션 선언
import java.lang.annotation.*;
@Target(ElementType.METHOD) /*매서드가 적용대상이고*/
@Retention(RetentionPolicy.RUNTIME) /*실행시에 PrintAnnotation 정보를 리플렉션으로 얻을 수 있다(유지됨)*/
public @interface PrintAnnotation {
String value() default " - ";
int number() default 15;
}
2) 어노테이션 설정
public class Service {
@PrintAnnotation // value="-", number=15
public void method1() {
System.out.println("실행 내용 1");
}
@PrintAnnotation("*") // value="*", number=15
public void method2() {
System.out.println("실행 내용 2");
}
@PrintAnnotation(value="#", number=20)
public void method3() {
System.out.println("실행 내용 3");
}
}
3) 어노테이션 출력
import java.lang.reflect.Method;
public class PrintAnnotationTest {
public static void main(String[] args) {
// service 클래스로부터 매서드 정보를 얻음
Method[] dMethods = Service.class.getDeclaredMethods();
for(Method method: dMethods) {
// 이 매서드에 어노테이션이 적용되어 있니?
if(method.isAnnotationPresent(PrintAnnotation.class)) {
// PrintAnnotation 객체 가져오기
PrintAnnotation printAnnotation = method.getAnnotation(PrintAnnotation.class);
// 정보(해당 매서드의 이름) 출력
System.out.println("["+method.getName()+"]");
// 구분선 출력
for(int i=0; i< printAnnotation.number(); i++) {
System.out.println(printAnnotation.value());
}
System.out.println();
// 매서드 호출
try {
method.invoke(new Service());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
4) 출력 결과
'Programming > Java * Spring' 카테고리의 다른 글
[JSP] JSP의 주요 구성 요소(템플릿 데이터, JSP 지시자, 스크립트릿, JSP 선언문, JSP 표현식) (0) | 2019.06.03 |
---|---|
[JSP] JSP의 구동 원리 (0) | 2019.06.03 |
[JSP] get request vs. post request 비교 (0) | 2019.05.31 |
[Java] 15. JDBC 기본 셋팅 방법 (0) | 2019.05.14 |
[Java] 14. Buffered Input/Output Stream, 일반 Stream과 속도 비교 (0) | 2019.04.05 |