예전에 처음 접하면서.. 머리 싸맬때 비하면 훨씬 쉽게(26배 정도) 읽힌다;;


public static Object invokeObjectMethod(Object object, String methodName,

                                                               Class[] paramClasses, Object[] params)  throws Exception
    {

       //아래의 삼항 연산자의 사용은 훌륭하다. 모든 Object형은 Class(타입)형 or Object(인스턴스)형 이다.(인터페이스 깜박했네

       //인터페이스도 결국 타입이지..)

        Class cls = object instanceof Class ? (Class)object : object.getClass(); 
        Method method = null;
        Object value = null;

        //클래스 계층을 순회하면서 메서드를 찾았다면 중단.

        while (cls != null && method == null)
        {
            try
            {
                method = cls.getDeclaredMethod(methodName, paramClasses); //메서드는 기본적으로 이름(타입,타입,타입)으로 식별

                //못찾으면 null이겠지 -_-a

                //내 기억으론 선언된 모든 메서드 몽땅 가져오는게 있었다. 그거라면 메서드 이름 몰라도 상관없이 실행가능..

                //정의된 메서드 객체를 가져오면 각 메서드마다 필요한 매개변수 정보도 가져올수 있었던가..? 기억이 가물..
                method.setAccessible(true); //public,private 깨부수기.. setAccessible()은 method가 null일 경우 조건 처리 안해도 되나?

                //modifier를 가져와서 내맘대로 요리할수도 있음;;
                value = method.invoke(object, params); //오브젝트=메서드가 정의된 클래스의 인스턴스와 오브젝트 배열=매개변수들로 

                //해당 메서드 수행해서 리턴값(메서드의 리턴결과)도 오브젝트 타입으로 받는다. 으하하 

                //다형성 만만세!
            }
            catch (NoSuchMethodException e) //메서드 못찾았으니 상위클래스 뒤져봐야지;;(하위 클래스가 필드 추가하고 생성자만 

            {                                                   //추가했을수 있으니.. 한마디로 재정의 메서드도 없고, 추가한 메서드도 없고..

                cls = cls.getSuperclass();
            }
            catch (IllegalAccessException e)
            {
                cls = null;
            }
        }

        return value; //얍삽하게? 메서드 수행결과를 얻어냈다. 
    }


=> reflect 활용하면.. 도대체 못할짓이 뭐냐 -_-;;


(추가)


모든 객체는 프로퍼티와 함수로 구성되어 있고, 해당 프로퍼티는 문자열의 이름을 갖고 있다. 함수도 문자열의 이름을 갖고 있다. 이름을 알고, 접근할 메서드도 있고, 함수를 수행할수 있는 로우레벨의 INVOKE도 알게 되었다. 

오픈소스 - 보안 이슈가 문득 머리를 스친다. 




(etc) iBatis vs Hibernate (나중에 여유되면 보기.. 빈 vs db간 동기화(매핑)를 지원하는 프레임워크 개념임)


http://blog.naver.com/killer10004?Redirect=Log&logNo=70105825997



(추가)


DB와 서버단에서 OO와 RDB의 갭을 조율해주는 미들웨어 이다. DI란 개념, CONFIG와 XML을 이용한 선언적인 처리, 

쿼리에 대한 자동 바인딩및 리절트 셋을 바로 OO 객체로 바인딩 해주는 기술로서.. 개발자의 어려움을 덜어준다.


다시 한번 느끼지만.. 이 당시 이 개념을 한번 접해둔게, 추후 많은 이해에 도움이 되었다. 아는 만큼 볼수 있으며 아는만

큼 상대에게 종속되지 않고 능동적이 될 수 있다. 힘내자!



by givingsheart 2014. 1. 1. 16:12
| 1 |