java 2008. 7. 29. 20:07

Java] java.lang.reflect.* 활용


*JSP 페이지로부터 form에 대한 값을 넘겨받아 useBean을 이용해서 값 저장
    -  jsp action 페이지에서 값을 저장후 reflect를 사용한 클래스 호출

     <jsp:useBean id="vo" class="com.bbs.BbsVO">
         <jsp:setProperty name="vo" property="*"/>
     </jsp:useBean>

     com.util.BeanExamer.survey(vo);   // 자바클래스의 reflect를 이용한 클래스


* BeanExamer.java

package com.util;
import java.lang.ref.*;
import java.lang.reflect.*;    // reflect를 사용하기 위한 import
import java.util.*;

public class BeanExamer {
 
public static void survey(Object obj){
 
  Class clz = obj.getClass();   // 인자로 전달받은 vo객체를 통해 클래스를 얻어냄
     
  Method[] methods = clz.getDeclaredMethods();  
    // 위에서 얻어낸 클래스를 통해  해당 클래스에 선언된 메소드들을 배열에 저장

  ArrayList<Method> getMethods = new ArrayList<Method>(); // ArrayList에 메소드 타입으로 제너릭 설정
 
 
  for(int i = 0; i < methods.length;i++){  
/* 클래스에 선언된 메서드수만큼 loof를 시키고 get으로 시작하는 메서드만 ArrayList에 저장 */
   if(methods[i].getName().startsWith("get") == true){
    getMethods.add(methods[i]);                           
   }
  }
 
  if(getMethods.size() <= 0){
   return;
  }
 
  for(int i = 0; i < getMethods.size() ; i++){
   Method m = getMethods.get(i);  
   try {
    System.out.println(m.invoke(obj, null));   //invoke 메소드에 관한 내용은 아래내용을 참고
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }
}

1.원형

  Object invoke( Object obj, Object[] args )


2.사용

  Class myclass = Class.forName( "package.name.MyClass" ); //특정 클래스의 클래스를 가져옴

  Object myclassInstance = myclass.newInstance(); // 특정 클래스의 인스턴스 생성

  Method[] methods = myclass.getMethods();  // 클래스의 메소드를 가져옴


  // 메소드의 매개변수를 설정. 타입에 따라 Object 배열 초기화 코드의 내용이 틀려짐.

  Object[] params = new Object[] { new Integer( value ) };

  methods[0].invoke( myclassInstance, params );  //invoke함수는 클래스안에 메소드를 호출하게된다.

Method 클래스의 invoke 함수의 API 입니다. 보다시피 매개변수로 첫번째 메소드를 실행시킬 인스턴스나 클래스
를 넣어줘야 하고, 그 메소드의 매개변수를 Object 배열로 넣게 된다.
따라서 인트는 new Integer()로 감싸주거나 new BigDecimal()로 감싸주어 Object형으로 캐스팅 되게끔하고
String은  그 자체로서 Obejct형으로 캐스팅 되면서 Object[]배열로서 매겨변수로 들어가데 된다.
그러면 그 함수의 매개변수에 배열의 순서대로 넣어서 실행을 시킬수 있는것이다.