Jun's Blog

[Java] 예제를 통해 Annotation에 대해 알아보자 본문

High Java/Annotation

[Java] 예제를 통해 Annotation에 대해 알아보자

Fizzyelf 2020. 10. 22. 19:49

패키지 및 클래스, 인터페이스 구성

package kr.or.ddit.basic;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


public class AnnotationTest {
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
		
		//PrintAnnotation의 static 변수값 출력
		System.out.println(PrintAnnotation.id);
		
		// reflection 기능을 이용한 메서드 실행하기
		// 선언된 메서드 목록 가져오기
		Method[] declaredMethods = Service.class.getDeclaredMethods();
		
		for(Method m : declaredMethods) {
			System.out.println(m.getName());
			for(int i = 0; i<m.getDeclaredAnnotation(PrintAnnotation.class).count();i++) {
				System.out.print(m.getDeclaredAnnotation(PrintAnnotation.class).value());  // value값 출력 : % #
			}
			System.out.println(); // 줄바꿈 처리
			
			//방법 1
//			m.invoke(new Service()); // reflection 기능 이용한 메서드 실행
			
			//방법2
			Class<Service> klass = Service.class;
			Service service = (Service) klass.newInstance();
			m.invoke(service);
		}
	}
}

package kr.or.ddit.basic;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Annotation에 대하여....
 * 
 * 프로그램 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것.(JDK1.5부터)
 * 
 * 주석처럼 프로그래밍 언어에 영향을 미치지 않으면서도 다른 프로그램에게 유용한 정보를 제공함.
 * 
 * 종류 : 1. 표준 애너테이션 (주로 컴파일러에게 유용한 정보를 제공하기 위한 애너테이션)
 *      2. 메타 애너테이션 (애너 테이션을 위한 애너테이션, 즉 애너테이션을 정의할 때 사용함.)
 *   
 * 애너테이션 타입 정의하기
 * @interface 애너테이션이름 {
 *     타입요소이름();		// 반환값이 있고 매개변수는 없는 추상메서드의 형태
 * 		:
 * 		:
 * }
 * 
 * 애너테이션요소의 규칙
 * 1. 요소의 타입은 기본형(Primative), String, enum, annotation, class만 허용한다.
 * 2. ()안에 매개변수를 선언할 수 없다.
 * 3. 예외를 선언할 수 없다.
 * 4. 요소의 타입에 타입 매개변수(제너릭타입문자)를  사용할 수 없다.
 */

@Target(ElementType.METHOD)	// annotation이 적용 가능한 대상을 지정함.
@Retention(RetentionPolicy.RUNTIME) // annotation이 유지되는 기간(CLASS가 기본값)
public @interface PrintAnnotation {
	int id = 100; // 상수 선언가능. static final int id = 100;
	String value() default "-";	// 기본값을 '-'로 지정
	int count() default 20;
	
}

package kr.or.ddit.basic;


public class Service {
	
	@PrintAnnotation
	public void method1() {
		System.out.println("메서드1에서 출력되었습니다.");
	}
	
	@PrintAnnotation(value = "%")
	public void method2() {
		System.out.println("메서드2에서 출력되었습니다.");
	}
	
	@PrintAnnotation(value = "#", count = 25)
	public void method3() {
		System.out.println("메서드3에서 출력되었습니다.");
	}
}

package kr.or.ddit.reflection;

/**
 * 1. 리플렉션은 클래스, 또는 멤버변수, 메서드,  생성자에 대한 정보를 가져오거나 수정할 수 있다.
 * 2. Reflection API는 java.lang.reflection 패키지와 java.lang.Class를 통해서 제공된다.
 * 3. java.lang.Class의 주요 메서드
 *    - getName(), getSuperClass(), getInterface(), getModifiers()
 * 4. java.lang.reflect 패키지의 주요 클래스
 *    - Field, Method, Constructor, Modifier 등. 
 */

// Class 오브젝트(클래스의 정보를 담고있는)를 발생하기
public class T01_CalssObjectCreationTest {
	public static void main(String[] args) throws ClassNotFoundException {
		
		// 첫 번째 방법 : Class.forName() 메서드 이용
		Class<?> klass = Class.forName("kr.or.ddit.reflection.T01_CalssObjectCreationTest");
	
		// 두 번째 방법 : getClass() 메서드 이용
		T01_CalssObjectCreationTest obj = new T01_CalssObjectCreationTest();
		klass = obj.getClass();
		
		// 세 번째 방법 : .class이용
		klass = T01_CalssObjectCreationTest.class;
	}
}

출력 결과 화면

Comments