ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] Reflection Private
    프로그래밍/Java 2022. 1. 11. 00:07
    반응형

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

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

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


    1. Reflection Private

    이전 글에 이어서 Private 생성자, 메소드, 속성에 접근하여 생성자를 통해 객체를 생성하거나 메소드를 통해 해당 메소드를 실행하는 등 Private으로 선언된 Class 정보들을 이용하는 방법에 대해 알아보고자 합니다.

     

    2. Reflection Private 사용 방법

    getDeclaredConstructor, getDeclaredConstructors메소드

    메소드명과 같이 선언된 모든 생성자를 가져올 수 있습니다.

    'ClassObject'.getDeclaredConstructors();

    Class Object의 getDeclaredConstructors메소드를 통해 해당 Class의 정의되어 있는 모든 생성자를 가져올 수 있습니다.

     

    모든 생성자 메소드를 반환하므로 반환 타입은 Constructor[] 타입으로 반환 됩니다.

    'ClassObject'.getDeclaredConstructor(파라미터class 정보);

    Class Object의 getDeclaredConstructor메소드는 여러 생성자들 중 파라미터로 전달한 타입들이 맞는 생성자 1개를 반환합니다.

     

    Private으로 생성된 생성자를 통해 새로운 객체를 생성하려면 해당 생성자 메소드의 접근이 가능하도록 변경해야 됩니다.

     

    Construct.setAccessible(true);

     

    setAccessible메소드를 통해 해당 생성자 메소드의 접근이 가능하도록 변경한 뒤 newInstance메소드로 객체를 생성할 수 있습니다.

     

    만약 Private 생성자의 접근이 가능하도록 변경하지 않고 해당 생성자로 객체 생성을 시도하면 IllegalAccessException이 발생하게 됩니다.

     

    Private 생성자를 가져와 객체를 생성하는 Test 입니다.

     

    getDeclaredConstructors를 통해 Coupon Class에 선언된 2개의 생성자를 가져오는 것을 확인할 수 있습니다.

     

    또한 Private 생성자를 통해 객체를 생성하고 해당 쿠폰 객체의 이름 비교를 통해 정상적으로 객체가 생성된 것을 확인할 수 있습니다.

     

    마지막으로 setAccessible을 통해 접근이 가능하도록 변경하지 않고 객체생성 시 IllegalAccessException이 발생하는 것을 확인할 수 있습니다.

     

    getDeclaredMethod, getDeclaredMethods메소드

    메소드명과 같이 선언된 모든 메소드를 가져올 수 있습니다.

    'ClassObject'.getDeclaredMethods();

    Class Object의 getDeclaredMethods메소드를 통해 해당 Class의 정의되어 있는 모든 메소드를 가져올 수 있습니다.

     

    모든 메소드를 반환하므로 반환 타입은 Method[] 타입으로 반환 됩니다.

     

    getDeclaredMethods의 경우 getMethod와 달리 부모 Class의 메소드는 가지고 오지 않고 해당 Class에 정의된 메소드만 가져옵니다.

    'ClassObject'.getDeclaredMethod(메소드명, 파라미터class 정보);

    Class Object의 getDeclaredMethod메소드는 여러 메소드들 중 메소드명과 파라미터가 일치하는 메소드 1개를 반환합니다.

     

    Private으로 생성된 메소드를 통해 동작을 수행하려면 해당 메소드에 대한 접근이 가능하도록 변경한 뒤 invoke메소드를 통해 메소드를 수행할 수 있습니다.

    Method.setAccessible(true);

     

     

    setAccessible메소드를 통해 해당 메소드의 접근이 가능하도록 변경한 뒤 invoke 메소드로 동작을 수행할 수 있습니다.

     

    만약 Private 메소드의 접근이 가능하도록 변경하지 않고 해당 메소드로 invoke를 시도하면 IllegalAccessException이 발생하게 됩니다.

     

    Private 메소드를 가져와 수행하는 Test 입니다.

     

    getDeclaredMethods를 통해 Coupon Class에 선언된 8개의 메소드를 가져오는 것을 확인할 수 있습니다.

     

    또한 Private 메소드를 수행하고 해당 쿠폰 객체의 이름 discount값, minPrice값이 변경된 것을 확인할 수 있습니다.

     

    마지막으로 setAccessible을 통해 접근이 가능하도록 변경하지 않고 메소드 invoke 시 IllegalAccessException이 발생하는 것을 확인할 수 있습니다.

     

    getDeclaredField, getDeclaredFields메소드

    메소드명과 같이 선언된 모든 필드를 가져올 수 있습니다.

    'ClassObject'.getDeclaredFields();

    Class Object의 getDeclaredFields메소드를 통해 해당 Class의 정의되어 있는 모든 메소드를 가져올 수 있습니다.

     

    모든 메소드를 반환하므로 반환 타입은 Field[] 타입으로 반환 됩니다.

    'ClassObject'.getDeclaredField(필드명);

    Class Object의 getDeclaredField메소드는 여러 메소드들 중 필드명이 일치하는 필드 1개를 반환합니다.

     

    Private으로 생성된 필드의 값을 가져오려면 필드에 대한 접근이 가능하도록 변경한 뒤 get메소드를 통해 필드의 값을 가져올 수 있습니다.

    Method.setAccessible(true);

     

    setAccessible메소드를 통해 해당 필드의 접근이 가능하도록 변경한 뒤 get 메소드로 값을 가져올 수 있습니다.

     

    만약 Private 필드의 접근이 가능하도록 변경하지 않고 해당 필드로 get을 시도하면 IllegalAccessException이 발생하게 됩니다.

     

    Private 필드를 가져와 수행하는 Test 입니다.

     

    getDeclaredFields를 통해 Coupon Class에 선언된 5개의 필드를 가져오는 것을 확인할 수 있습니다.

     

    또한 Private 필드 discount의 값 10을 가져오는 것을 확인할 수 있습니다.

     

    마지막으로 setAccessible을 통해 접근이 가능하도록 변경하지 않고 필드 get 시 IllegalAccessException이 발생하는 것을 확인할 수 있습니다.

     

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

    반응형

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

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

    댓글

Designed by Tistory.