Reflection 이란 단어는 반사, 방향, 거울 등에 비친 상 이라는 의미를 담고 있습니다.
개발 당시 많이 사용 하는 new 연산자는 Class의 규칙에 의해서 객체화 된 Instance를 생성 합니다.
Test test = new Test();
Instance를 거울에 비추어 보면 반대로 Class의 정보를 얻을 수 있습니다.
거울의 역할을 하는 메소드는 Object Class의 getClass 라고 볼 수 있습니다.
아래는 실제 사용 예 입니다.
public final native Class<?> getClass();
이제 반대로 확인이 가능합니다. Class의 구성 요소인 생성자, 메소드, 전역 변수 등 정보가 필요 할 떄 사용되는 패키지가 java.lang.reflect 입니다.
패키지를 이용하면 변수의 값을 바꿀 수도 있고, 메소드를 실행도 할 수 있습니다. 막강한 기능인 패키지를 기반으로한 Instance 생성도 가능 합니다.
Java Framework 중 하나인 Spring의 중요한 기능인 DI(Dependency Injection) 가 동작이 가능한 것도 java.lang.Class<T>, java.lang.reflect 가 존재하기 때문 입니다.
DI 추가 설명 - http://blog.whitelife.co.kr/13
Spring ApplicationContent.xml 중 일부
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<bean class="kr.whitelife.controller.Wcontroller">
<constructor-arg ref="service"/>
</bean>
<bean id="service" class="kr.whitelife.service.Wservice">
<property name="dao" ref="dao"></property>
</bean>
<bean id="dao" class="kr.whitelife.dao.Wdao"/>
</beans>
<bean> 태그의 class 속성에 들어가 있는 정보를 가지고 package 기반의 Instance 생성을 할 수 있습니다.
간단한 예제 입니다.
import java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException; public class Reflective { public void message(String choice) throws NoSuchMethodException, NullPointerException, SecurityException, IllegalAccessException, InvocationTargetException { this.getClass().getDeclaredMethod(choice, (Class<?>[]) null).invoke(this); } public void hello() { System.out.println("hello"); } public static void main(String[] args) { try { Reflective r = (Reflective) Class.forName("Reflective").newInstance(); r.message("hello"); } catch (NoSuchMethodException e) { System.out.println(e); } catch (NullPointerException e) { System.out.println(e); } catch (ClassNotFoundException e) { System.out.println(e); } catch (SecurityException e) { System.out.println(e); } catch (InstantiationException e) { System.out.println(e); } catch (IllegalAccessException e) { System.out.println(e); } catch (InvocationTargetException e) { System.out.println(e); } } }
위 기능은 Package를 이용한 객체 생성, method 정보를 찾아서 실행 까지 합니다. 기존에 new 연산자를 이용해서 Instance 생성을 했다면 reflect 패키지 활용 시 문자열을 활용하여 동적으로 Instance 제어가 된다.
Java의 상속, 인터페이스와 더불어 reflection과 결합하게 된다면 훨씬 개발이 요구사항에 따른 대응이 수월해지고, Class 단위의 분기를 했다면, Method 단위의 분기도 수월하게 처리가 가능 합니다.
※ 참고 사이트
Java API - http://docs.oracle.com/javase/6/docs/api/
이미지 URL - http://www.clker.com/cliparts/e/K/g/G/i/j/blue-stick-man-reflect-hi.png
'Java' 카테고리의 다른 글
Java HashMap Key 정렬 하기 (0) | 2014.09.24 |
---|---|
Google Guava 라이브러리 사용하기 (0) | 2014.07.24 |
Java Console 게시판 만들기 - 4 (4) | 2013.11.13 |
Java Console 게시판 만들기 - 3 (0) | 2013.11.12 |
Java Console 게시판 만들기 - 2 (0) | 2013.11.11 |