ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] Reflection Invoke
    프로그래밍/Java 2021. 12. 31. 01:04
    반응형

    이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.

    틀리거나 잘못된 정보가 있을 수 있습니다.

    댓글로 알려주시면 수정하도록 하겠습니다.


    Reflection 기본인 Class Object, Method, Field, Construction 정보를 가져오는 포스팅 다음으로 Method를 실행하는 Invoke에 대해 포스팅 하고자 합니다.

     

    1. Invoke 메소드

    이전 포스팅에서 Class Object를 통해 Class의 여러 정보를 가져오는 예제를 확인해 보았습니다.

     

    여러 Class 정보 중 Field의 경우 Value를 가져오거나 변경하는 등의 작업이 주된 작업이 될 수 있지만 Method의 경우는 실행이 주 목적이 됩니다.

     

    Class Object를 통해 Method 정보를 가져온 주 목적은 해당 Method를 실행하는 것이 주 목적이 될 것입니다.

     

    이때 Method를 동적으로 실행시켜 주는 메소드가 바로 Invoke 메소드 입니다.

     

    2. Invoke 사용 방법

    일반적으로 Method를 사용하는 방법을 테스트 하도록 하겠습니다.

     

    getDiscountAmount 메소드는 특정 가격의 상품을 구매 하였을때 해당 쿠폰으로 할인 받을 수 있는 금액을 반환하는 메소드 입니다.

     

    일반적인 경우 이 메소드를 이용하는 경우 Coupon 생성자를 통해 객체를 생성하고 해당 객체의 getDiscountAmount 메소드를 호출하여 상품의 가격을 파라미터로 전달하여 할인 금액을 얻을 수 있습니다.

     

    위 경우 Coupone객체.사용하고자 하는 메소드명(전달 파라미터) 형태로 메소드를 이용하고 있습니다.

     

    이번에는 Reflection을 이용한 방법을 테스트 하도록 하겠습니다.

     

    먼저 사용할 Class Object를 forName 메소드를 통해 Class Object를 전달 받아야 됩니다.

     

    전달 받은 Class Object의 getMethod 메소드로 Method 정보를 받아 옵니다.

     

    여기 까지는 이전 포스팅의 Reflection의 기본과 동일합니다.

     

    현재 가지고 있는 정보는 Method 정보와 Class 정보입니다.

     

    이제 메소드를 실행 시킬 Coupon의 객체가 필요합니다. 위에서 Class Object의 경우는 Coupon의 객체가 아닌 Coupon Class 이므로 객체가 될 수 없습니다.

     

    즉 일반적으로 객체를 생성하는 것 처럼 new 키워드를 사용한 객체 생성이 필요 합니다.

     

    위 이미지 처럼 Class Object의 생성자 메소드를 가져와 newInstance 메소드를 이용하여 Reflection에서도 new 키워드 처럼 객체를 생성할 수 있습니다.

     

    getConstructor 메소드를 이용하여 사용하고자 하는 생정자 메소드를 가져온 후 newInstance 메소드를 통해 생성자에 전달 할 값들을 전달하면 Object 타입의 객체를 생성하여 반환하여 줍니다.

     

    이제 Coupon객체를 생성하였으니 Method 실행도 가능하게 되었습니다.

     

    Class Object를 이용해 가져온 Method 객체의 invoke 메소드를 호출하여 메소드 실행 결과를 반환 받을 수 있습니다.

     

    invoke 메소드의 첫번째 파리미터는 메소드를 실행할 객체가 되며 두번째 파라미터는 해당 메소드의 파라미터 값을 전달 할 수 있습니다.

     

    위 테스트를 통해 동일한 값의 Coupon 객체를 생성하고 일반 메소드 실행과 Reflection으로 메소드 실행의 결과가 동일 한 것을 확인할 수 있습니다.

     

    사용된 예제 코드는 Git에 있습니다.

    반응형

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

    [Java] toString 메소드 재정의  (0) 2022.03.03
    [Java] Reflection Private  (0) 2022.01.11
    [Java] Reflection(리플렉션)  (0) 2021.12.29
    [Java] 트랜잭션  (0) 2021.11.13

    댓글

Designed by Tistory.