- JAVA REFLECTION 개념잡기 목차
JAVA에 보면 REFLECT라는 말이 자주 나옵니다. 처음에는 저도 이게 무슨 소린지 몰랐지요.
그런데 인터넷에 다 나옵니다. 정보의 바다니까요.. 일단 reflect에 대해서 직접적으로 몰라도 아마 java개발자라면 알게 모르게 다들 사용하고 있는 것 같아요.
예를 들면 java에서 ojdbc호출할 때
Class.forName("oracle.jdbc.driver.OracleDriver");
라는 부분이 들어가지요. 그리고 톰켓에 web.xml설정 할 때 보면 서버가 실행시키는 서블릿을 지정하는 부분이 나옵니다.
스프링에서 설정한 web.xml을 보면.
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
이렇게 말이죠. 스프링에서는 "@Autowired"처럼 간단하게 어노테이션만 붙이면 객체 가져오거나 트렌젝션 적용되는것.
감이 오시나요.? 이런걸 가능하게 하는게 그 말로만 듣던 reflection이라는 겁니다.
자~~~ 다음 예제는 reflect패키지의 클래스를 이용해서 객체를 생성하는 겁니다.
package com.test.mpapp;
import java.lang.reflect.InvocationTargetException;
class Re1{
String a = "우리는 ";
String b = "하나";
int c = 1;
public Re1(){
}
public void setData(String a, String b, int c){
this.a = a;
this.b = b;
this.c = c;
}
public String toString(){
return a+" : "+b+" : "+c;
}
}
public class Test1 {
public static void main(String[] args) throws ClassNotFoundException,
InstantiationException, IllegalAccessException,
NoSuchMethodException, SecurityException, IllegalArgumentException,
InvocationTargetException {
Class cl = Class.forName("com.test.mpapp.Re1");
Object obj = cl.newInstance();
System.out.println(obj);
}
}
출력은
그런데 다음 부분에 대해서 대체방법은 또 있습니다.
Class cl = Class.forName("com.test.mpapp.Re1");
다음과 같이
1. Class c1 = Re1.class
2. Class c1 = new Re1().getClass();
그냥 Class의 객체만 가져오면 장땡입니다.
이제 메소드 호출하는 방법을 알아보겠습니다
Re1 re1 = new Re1();
Class cl = Class.forName("com.test.mpapp.Re1");
Object obj = cl.newInstance();
Class[] paramTypes = {String.class, String.class, Integer.TYPE};
Method met1 = cl.getMethod("setData", paramTypes);
met1.invoke(obj, "나는 ", "누구인가 ", 00);
System.out.println(obj);
결과는 다음과 같습니다.
네.. 좀 복잡해 보이기는 해도 생각했던거보다 별거 없다고 느끼시리라 생각됩니다.
특히 이부분
{String.class, String.class, Integer.TYPE};
여기서 다른거는 다 class인데 왜 int인자가 들어가는 부분만 Integer.TYPE가 들어가느냐~!!!?
그건 메소드 인자가 int이기 때문이죠. primitive타입이라고 하더라구요. 만약 int가 아니고 Integer객체의 인자가 들어오면 다른것과 같이 Integer.class로 쓰면 됩니다.
'개발언어 > JAVA' 카테고리의 다른 글
클래스 로더를 이용한 프로퍼티 읽어오기 (0) | 2014.04.07 |
---|