• 로그인 함 해보끄나?

  • Sarangnamu.net June 17, 2003
    Home Login Profile Study Open Project Q&A Google Code
    코틀린 Reflect
    https://fossies.org/linux/kotlin/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KDeclarationContainerImpl.kt
    
    0. java api 를 사용하므로 Reflection 도 크게 다르진 않지만 약간 혼돈되는 부분으로 '*' 이 있는데 처음엔 코틀린에 포인터 개념이 있나? 했지만 spread (전개) 연산자 였다. 
    1. 참고로 * 를 넣지 않으면 타입이 맞지 않기 때문에 제대로 동작하지 않는다. 
    2. kotlin 은 cpp 과 마찬가지로 인자에 대해서 기본 값을 설정할 수 있기 때문에 java 에서 오버로딩 할 걸 그냥 하나의 메소드로 구현 가능한게 장점 
    
    class Reflect {
        companion object {
            fun <T> instantiate(klass: Class<out T>, types: List<Class<out Any>>? = null, vararg args: Any?): T {
                if (klass.isInterface) {
                    throw RuntimeException("Specified class is interfaces: " + klass.name)
                }
    
                // array 로 하고 싶었으나 동작 안함, list 로 전달한 뒤 array 로 변환 후 이를 변경
                try {
                    if (args.isNotEmpty()) {
                        val constructor = klass.getDeclaredConstructor(*types!!.toTypedArray())
                        return constructor.newInstance(*args)
                    } else {
                        return klass.newInstance()
                    }
                } catch (e: Exception) {
                    throw RuntimeException(e)
                }
            }
    
            fun <T> instantiate(constructor: Constructor<out T>, vararg args: Any?): T {
                try {
                    return constructor.newInstance(*args)
                } catch (e: Exception) {
                    throw RuntimeException(e)
                }
            }
        }
    }

    Comment


    입력하3 1508772403



    Locations of visitors to this page