- Reflection -
실행 중인 프로그램 내부에서 자바 타입들에 대해 알아내기 위해 자바 reflection 패키지를 사용할 수 잇다.
예를 들면, 특정 클래스의 모든 메소드 명의 목록을 수할 수도 있고, 그것을 보여줄 수도 있다.
혹은 특정 메소드를 나타내는 java.lang.reflect.Method 객체를 가질 수도 있고, 그 객체를 메소드에 대한 일종의 포인터 처럼 사용할 수도 있다.

컴파일시 사용 하는 것이 아니라 런 타임에 필요한 클래스의 메소드를 찾아서 사용할 수 있다.

형식 1.

 import java.lang.reflect.*;

public class NewObjectTest2{

   public static void main(String[] arg)

   throws ClassNotFoundException, InstantiationException, IllegalAccessException

         ,NoSuchMethodException, InvocationTargetException

   {

       Class c = String.class;

       Class[] argType = new Class[]{String.class};

       Constructor con = c.getConstructor(argType);

       Object[] initArg = new Object[]{"Hello World"};

       Object obj = con.newInstance(initArg);

       if(obj instanceof String){

          System.out.println("String형이 맞습니다.:" + obj);

       } else {

          System.out.println("Vector형이 아닙니다.");

       }

   }

}

 java.lang.String 클래스의 생성자 리플렉션 예제 입니다.

 

Class c = String.class; // String 클래스를 클래스 타입으로 케스팅한 것입니다.

참고로, 자바의 모든 객체는 Class 입니다. (프리미티브 타입도 마찬가지 입니다)

그러니까 Class 를 통해 리플렉션을 할 수 있는 것이겠죠...

  

Class[] argType = new Class[]{String.class};

String 클래스를 클래스 베열에 등록 합니다.

현재는 리플렉션 대상이 String 클래스 하나이지만, 여러 개의 클래스를 동시에 리플렉션 할수도 있겠죠

그래서 배열로 Class를 선언한 것입니다.

 

Constructor con = c.getConstructor(argType);

클래스배열 argType 에서 생성자들만 잡아옵니다.

 

String 클래스는 인자가 없는것과, 인자가 있는것 두가지의 생성자가 존재합니다. 그쵸?

new String(); 과 new String("인자있음");  이 그것입니다.

이것이 메서드 오버로딩 이라고 다들 알고 있을 겁니다.

 

 

Object[] initArg = new Object[]{"Hello World"};

파라미터를 설정하고 있습니다.

클래스를 리플렉션을 통해 생성자로 클래스를 인스턴스화 할때

메서드(생성자) 오브로딩을 통해 인스턴스화 하려고 파라미터를 설정하고 있습니다.

 

이건 new String("인자있음"); 에서 initArg 이 "인자있음" 이 되는 것입니다.

리플렉션을 통해서 아규먼트를 세팅할경우에 이처럼 Class[] 배열로 설정하게 됩니다.

아규먼트는 여러타입의 여러 인자가 올수 있기때문입니다.

 

 

Object obj = con.newInstance(initArg);

최종적으로 String 클래스가 인스턴스화 되었습니다.

 

이코드는 new String("인자있음"); 과 동일합니다.

 

// 인스턴스 객체의 비교

if(obj instanceof String){
  System.out.println("String형이 맞습니다.:" + obj);
}
else {
  System.out.println("String 형이 아닙니다."); // 여기 오타나셨네요
}

 

참고하시기 바랍니다.



출처 : 나, http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040201&docId=65205977&qb=7J6Q67CUIOumrO2UjOugieyFmA==&enc=utf8&section=kin&rank=3&sort=0&spq=1&pid=gtlHQB331xlssbgIl4Nssv--045286&sid=TBgU4jgGGEwAADFKD7A


간단 소스

import java.lang.reflect.*;
       

   public class field1 {
      private double d;
      public static final int i = 37;
      String s = "testing";
       
      public static void main(String args[])
      {
         try {
            Class cls = Class.forName("field1");   // field 클래스 로딩        
        

            // 로딩한 클래스내 필드 목록 출력
            Field fieldlist[]
              = cls.getDeclaredFields();
            for (int i
              = 0; i < fieldlist.length; i++) {
               Field fld = fieldlist[i];
               System.out.println("name
                  = " + fld.getName());
               System.out.println("decl class = " +
                           fld.getDeclaringClass());
               System.out.println("type
                  = " + fld.getType());
               int mod = fld.getModifiers();
               System.out.println("modifiers = " +
                          Modifier.toString(mod));
               System.out.println("-----");
            }
          }
          catch (Throwable e) {
             System.err.println(e);
          }
       }
   }

 

'Java' 카테고리의 다른 글

[Java] Java Property(ClassLoader)  (0) 2010.06.17
[Java] Java Property(위치 지정)  (0) 2010.06.17
[Java] 오버로딩, 오버라이딩  (0) 2010.06.16
[Java] 자료구조!!  (0) 2010.06.03
[Java] 자바 소스코드 많은 추천 싸이트!!!  (0) 2010.06.03

+ Recent posts