[Kotlin] 리플렉션

Leechaeyeon·2023년 5월 22일

Reflection 리플렉션

  • 프로그램 실행 중에 프로그램의 구조 ( 객체, 함수, 프로퍼티 ) 를 분석하는 기법
  • 객체의 클래스 타입, 클래스 정보, 생성자 정보, 프로퍼티 정보등을 실행 중에 파악할 수 있다.

클래스 타입

  • KClass<클래스타입> : 지정된 클래스의 타입을 파악한다. ( 코틀린 클래스 )
    	val a1: KClass<String> = String::class
        println("String의 코틀린에서의 타입 : $a1")
  • Class<클래스 타입 > : 지정된 클래스의 타입을 파악한다. ( 자바 클래스 )
    	val a2:Class<String> = String::class.java
        println("String의 자바에서의 타입 : $a2")
  • 변수를 통해 접근할 수 있는 객체의 클래스 타입 파악
    	val str1 = "안녕하세요"
        val a3:KClass<out String> = str1::class
        println("str1을 통해 접근할 수 있는 객체의 클래스 타입(코틀린) : $a3")
    
        val a4:Class<out String> = str1::class.java
        println("str1을 통해 접근할 수 있는 객체의 클래스 타입(자바) : $a4 ")

⇒ 출력

  • 클래스로 파악
    class TestClass
    
    fun main(){
    	 val test1 = TestClass()
    
        val a7 = test1::class
        val a8 = test1::class.java
        println("test1의 클래스 타입(코틀린) : $a7")
        println("test1의 클래스 타입(자바) : $a8")
    }
    

  • 클래스 정보 파악
    class TestClass
    
    fun main(){
    		val test2 = TestClass()
    		
    	println("추상 클래스 인가 : ${test1::class.isAbstract}")
        println("Companion 클래스 인가 : ${test1::class.isCompanion}")
        println("Data 클래스 인가 : ${test1::class.isData}")
        println("final 클래스 인가 : ${test1::class.isFinal}")
        println("open 클래스 인가 : ${test1::class.isOpen}")
        println("중첩 클래스 인가 : ${test1::class.isInner}")
        println("Sealed 클래스 인가 : ${test1::class.isSealed}")
    }
    test1::class.java → test1이 어떤 클래스로 구성된 객체인지 확인하는 것
    • gradle 모든 클래스 쓰기 위해서 사용하는 법

주 생성자과 property는 에러남

fun main(){
		val test1 = TestClass(100,200,300)

// 생성자 정보
    val constructors = test1::class.constructors
    // println(constructors)

    for(con in constructors){
        println("constructor : $con")

        // 생성자의 매개 변수들을 가져와 출력해본다
        for(param in con.parameters){
            println("parameter 순서 : ${param.index}")
            println("parameter 타입 : ${param.type}")
            println("parameter 이름 : ${param.name}")
        }

// 주 생성자 생성자
    val primaryCon = test1::class.primaryConstructor
    if(primaryCon!=null) {// 주생성자가 없을 수 있기 때문
        for(param in primaryCon.parameters){
            println("parameter 순서 : ${param.index}")
            println("parameter 타입 : ${param.type}")
            println("parameter 이름 : ${param.name}")
        }
    }
    // Property
    val pro = test1::class.declaredMemberProperties

    for(p1 in pro){
        println(p1.name)
    }
}
class TestClass(var number1:Int, var number2:Int, var number3:Int){
		var number4:Int = 0
    var number5:Int = 0
    constructor(a1:Int) : this(100, 200, 300)

    constructor(a1:Int, a2:Int) : this(100, 200, 300)
}

0개의 댓글