자바코드에서 흔히 @Bean
과 같이 @와 함께 코드에 표시하던 것이 있다. 이런 것들을 어노테이션이라 부르는데, 평소에 생각없이 그냥 쓰기만 했었는데 공부를 해야할 것 같아 찾아보았다.
정의 방법
@Target({ElementType.[적용대상]}) @Retention(RetentionPolicy.[정보유지되는 대상]) public @interface [어노테이션명]{ public 타입 elementName() [default 값] ... }
예시 코드(Configuration)
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Configuration { @AliasFor(annotation = Component.class) String value() default ""; boolean proxyBeanMethods() default true; }
설명
@Target
- 어떤 값에 어노테이션을 적용할 것인지 나타낸다.
- TYPE - 클래스, 인터페이스, 열거 타입
- ANNOTATION_TYPE - 어노테이션
- 각 이름대로
- FIELD, CONSTRUCTOR, METHOD, LOCAL_VARIABLE, PACKAGE
@Retention
- 어노테이션 값들을 언제까지 유지할 것인지.
- SOURCE - 소스상에서만 어노테이션 정보를 유지. 소스 분석시만 사용.
- CLASS - 바이트 코드 파일까지 어노테이션 정보 유지. 리플렉션 이용 불가
- RUNTIME - 바이트 코드 파일까지 정보 유지, 리플렉션을 이용해 런타임에 정보를 얻을 수 있음
리플렉션
객체를 통해 클래스의 정보를 분석해 내는 프로그램 기법
실행중인 자바프로그램 내부를 검사하고 내부의 속성을 수정할 수 있도록 한다.
또한 자바에서 동적으로 객체를 생성할 수 있도록 한다.
Spring의 BeanFactory는 어플리케이션이 실행한 후 객체가 호출 될 당시 객체의 인스턴스를 생성하게 되는데 그 때 필요한 기술이 Reflection이다java.lang.reflect Class c = Class.forName("java.lang.String"); Class c = Data.class; Class c = Integer.TYPE; Wrapper에 기정의된 타입. Method m[] = c.getDeclaredMethods(); Method[] m = c.getMethods(); Field[] f = c.getFields(); Constructor[] cs = c.getConstructors(); Class[] inter = c.getInterfaces(); Class superClass = c.getSuperclass();