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

+ Recent posts