Reflection

송규빈·2022년 8월 18일
0

Reflection이란?

Reflection은 거의 모든 언어에는 없고 자바에는 있는 기능으로서 프로그램 내부 속성을 조작할 수 있게 하는 자바 API입니다.
클래스로 예를 들면, 구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수 등에 접근할 수 있도록 해줍니다.(private으로 선언되어 있어도 접근 가능)
물론 자바와 호환이 되는 코틀린에서도 사용이 가능합니다.

이번 글에서는 코틀린으로 예제를 작성해보겠습니다.

예제

클래스 정보 가져오기

gyul.songgyubin.daytogo.models 패키지 아래에 User라는 data class를 선언했습니다.

val clazz = User::class.java
println(clazz.toGenericString())

이에 대한 결과는

이렇게 해당 클래스에 대한 정보를 얻을 수 있습니다.

또한, 클래스에 선언된 메서드 및 변수들의 정보들도 얻을 수 있습니다.

메서드 정보 가져오기

User 클래스에는 uid:String 과 email:String 이라는 프로퍼티가 있습니다.
data class는 아시겠지만, 자동으로 getter와 setter를 만들어주죠.
이러한 특성을 이용해서 getter를 호출해보겠습니다.

val method = clazz.getMethod("getUid")
println(method.invoke(User("myUid","myEmail")))

아래처럼 uid에 넣은 값이 제대로 출력되고 있는 것을 확인할 수 있습니다.

필드 정보 가져오기

위에서 말했다시피 User클래스에는 uid와 email이 있습니다.
이러한 필드명을 가져올 수도 있습니다.

    val fields = clazz.declaredFields
    fields.forEach {
        println(it.toGenericString())
    }

하지만 리플렉션은 비용이 큰 작업이므로 정말 필요할 때만 사용하면 좋을 것 같습니다 :)

이렇게 유용한 기능으로 이번에 앱 개발을 하면서 문제를 하나 해결했는데요.
궁금하시다면 여기로(Mapper 참고) 오셔서 한 번 읽어보시기 바랍니다.

profile
🚀 상상을 좋아하는 개발자

0개의 댓글