[java] getClass, getMethod, invoke

프로그래밍/Java 2010. 1. 22. 15:22 Posted by galad
public static void setAllowedTypes(FileUploadInfo info, SubContentInfo sinfo) throws ContentException {
    log.debug("<< setAllowedTypes >> START");

    Class cls = info.getClass();
    Class scls = sinfo.getClass();
    Method[] mtd = cls.getDeclaredMethods(); // cls에 선언된 모든 메소드를 반환
    Pattern p = Pattern.compile("get_fileUpload_(\\d+)FileName"); // 패턴 설정. \d+ 는 정수 하나 이상(정규식)
    Matcher m = null;
    String mStr = null;
    String mType = null;
    String defExt = null;
    int i;

    for(i = 0; i < mtd.length; i++) { // 모든 메소드만큼 돌면서
        m = p.matcher(mtd[i].getName()); // 메소드명과 패턴을 비교
        if(m.find()) { // 매칭된 것이 발견되면
            try {
                // group으로 매칭된 내용(메소드명)을 받아서 그 메소드를 실행. 파일명을 얻음.
                mStr = FileUploadInfo.getValueOfMethod(info, m.group());
                if(mStr != null) { // 파일명이 존재하는 경우만
                    // group(1)으로 매칭된 번호를 얻어서 메소드 실행. 콘텐트 타입을 얻음.
                    mType = FileUploadInfo.getValueOfMethod(info, "get_fileUpload_" + m.group(1) + "ContentType");
                    // 기본 확장자 지정
                    defExt = "";
                    if(mType != null) {
                        defExt = mStr.substring(mStr.lastIndexOf(".") + 1);
                        defExt = defExt.toLowerCase().trim();
                       
                        log.debug("defExt = " + defExt);
                       
                        if("jpg".equals(defExt) ||
                           "gif".equals(defExt) ||
                           "xml".equals(defExt) ||
                           "xmp".equals(defExt) ||
                           "png".equals(defExt) ||
                           "zip".equals(defExt) ) {
                            // 진행
                        }else {
                            // 오류 발생
                            throw new ContentException("지원하지 않는 파일입니다.");
                        }
                    }
                   
                    Class[] cParam = new Class[]{String.class};
                    // 메소드를 찾는데, 메소드명이 "set...."이고 cParam형식을 파라미터로 갖는 메소드를 반환. null이면 파라미터 없는 메소드
                    // cParam이 Class 배열인 것은 파라미터가 여럿인 메소드가 있기 때문에.
                    // 여기서는 String을 파라미터로 갖는 set_fileUp.... 메소드를 반환.
                    Method cMtd = cls.getMethod("set_fileUpload_" + m.group(1) + "FileName", cParam);
                    Object[] oParam = new Object[]{mStr};
                    // FileUploadInfo에 등록
                    cMtd.invoke(info, oParam); // info의 set_fileUpload_XFileName 메소드를 실행. 파라미터는 oParam
                    // SubContentInfo에 등록
                    // 1. FileUPloadInfo의 FieldName을 찾는다.
                    cMtd = cls.getMethod("get_fileUpload_" + m.group(1) + "FieldName", null);
                    String tmpFieldName = (String)cMtd.invoke(info, null); // 업로드 파일명을 저장할 대상 필드명을 얻어서
                    // 2. SubContentInfo의 의 1번의 Method에 등록한다.
                    cMtd = scls.getMethod("set" + tmpFieldName.substring(0, 1).toUpperCase() + tmpFieldName.substring(1)  , cParam);
                    cMtd.invoke(sinfo, oParam); // 서브콘텐츠info에 저장함.

                }
            }
            catch (ContentException e) {
                log.debug("지원하지 않는 파일 예외 발생", e);
                throw e;
            }
            catch (Exception e) {
                    e.printStackTrace();
            }
        }
    }

}

public static String getValueOfMethod(Object obj, String methodName)
        throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
    String str = "";
    Class cls = obj.getClass();
    Method mtd = cls.getMethod(methodName, null); // 넘겨받은 오브젝트의 클래스의 메소드를 얻어서
    str = (String)mtd.invoke(obj, null); // 메소드를 실행시킴.
    // 이때 파라미터로 받은 오브젝트는 메소드가 실행될 대상 오브젝트. 즉, obj의 메소드 mtd를 실행함.

    return str;
}

동적으로 움직이는 기능을 만들기 위해서는 필수적.

'프로그래밍 > Java' 카테고리의 다른 글

[java] Convert Milliseconds to Date  (0) 2010.03.15
[java] invoke  (0) 2010.03.09
[java] Pattern / Matcher  (0) 2010.01.22
[java] 파일 관련  (0) 2010.01.07
[java] thorws .....  (0) 2009.12.11