Kotlin 언어 공부 #1 - Reflection 이용하여 객체의 private 필드 읽는 방법

data class Member(
    private val id: String,
    private val name: String,
    private val point: Int
)

위와 같은 Member 클래스가 있다고 가정해 봅시다. 필드들은 모두 private이어서 외부에서 직접 접근은 불가능합니다. 그런데 유닛 테스트를 진행하기 위해서는 private 필드들에 접근할 수 있어야 합니다. 이 때 필요한 것이 바로 reflection입니다. 이를 이용하여 클래스의 정보를 알 수 있고, 클래스의 일부 필드나 함수의 접근 제한을 풀 수 있습니다.

아래 코드는 Member 객체를 정의하고 그것의 id 필드를 테스트하는 코드입니다. Member::class.java.declaredFields를 통해 Member 클래스의 필드들에 접근할 수 있고, id 필드의 접근 제한을 푼 후 id 값을 체크합니다. first { ... }는 { ... } 조건을 만족하는 첫번째 필드를 구합니다. 필드 객체들 중 이름(name)이 "id"인 것을 찾구요. 찾는데 성공했다면, 그것의 isAccesible을 true로 설정하여 Member 객체의 id 필드 접근이 가능해집니다. 해당 필드 객체의 get(대상객체) 함수를 호출하여 id 값을 읽을 수 있습니다. 대상객체에는 Member 객체를 대입하면 됩니다.

class TempTest {

    @Test
    fun testPerson() {
        val john = Member("smartjohn", "John", 10000)

        Member::class.java.declaredFields.first { field ->
            field.name == "id"
        }?.let { field ->
            field.isAccessible = true

            val id = field.get(john)
            Assert.assertEquals("smart_john", id)
        }
    }
}

Coin Marketplace

STEEM 0.18
TRX 0.13
JST 0.029
BTC 57324.42
ETH 3010.01
USDT 1.00
SBD 2.36