Я пытаюсь написать обработчик вызова, который использует карту (предоставляется во время выполнения) для реализации геттеров интерфейса.
Это очень грубо работает. Я знаю основные типы, которые могут быть возвращены, поэтому я в порядке с выражением when.
Я не нашел способа избежать использования имени класса в качестве субъекта выражения when; есть ли лучший способ?
class DynamicInvocationHandler<T>(private val delegate: Map<String, Any>, clzz: Class<T>) : InvocationHandler {
val introspector = Introspector.getBeanInfo(clzz)
val getters = introspector.propertyDescriptors.map { it.readMethod }
override fun invoke(proxy: Any, method: Method, args: Array<Any>?): Any? {
if (method in getters) {
// get the value from the map
val representation = delegate[method.name.substring(3).toLowerCase()]
// TODO need better than name
when (method.returnType.kotlin.simpleName) {
LocalDate::class.simpleName -> {
val result = representation as ArrayList<Int>
return LocalDate.of(result[0], result[1], result[2])
}
// TODO a few other basic types like LocalDateTime
// primitives come as they are
else -> return representation
}
}
return null
}
}