我正在尝试编写一个调用处理程序,该处理程序使用一个映射(在运行时提供)来实现接口的getter。
这非常粗糙。我知道可能会返回的基本类型,因此可以使用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
}
}
答案 0 :(得分:3)
when
表达式支持任何类型(不同于Java的switch
),因此您可以只使用KClass
实例本身:
when (method.returnType.kotlin) {
LocalDate::class -> {
...
}
...
}
答案 1 :(得分:0)
您可以在when
语句中使用类型代替类名。匹配类型后,Kotlin智能投射将自动投射
示例
val temporal: Any? = LocalDateTime.now()
when (temporal){
is LocalDate -> println("dayOfMonth: ${temporal.dayOfMonth}")
is LocalTime -> println("second: ${temporal.second}")
is LocalDateTime -> println("dayOfMonth: ${temporal.dayOfMonth}, second: ${temporal.second}")
}