JAVA REFLECTION 개념잡기

2014년 02월 08일 by 다루이.

    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