Как получить тип экземпляра javax.lang.model.element.Element
Я слежу за Hello World of Annotation Processing в документации Kotlin и KotlinPoet и пытаюсь реализовать универсальный компоновщик для Kotlin. Я хотел бы в общем случае создать метод для каждого поля в аннотированном классе данных и дать его аргументу то же имя и тип поля. Проблема в том, что я не могу найти, какой тип поля, учитывая случай javax.lang.model.element.Element
что у меня есть. Вот что мне удалось сделать так далеко:
fieldsIn(klass.enclosedElements)
.forEach {
classBuilder
.addProperty(PropertySpec
.builder(it.toString(), String::class, KModifier.INTERNAL)
.mutable(true)
.initializer("\"\"")
.build())
classBuilder
.addFunction(FunSpec
.builder(it.toString())
.addParameter(ParameterSpec
.builder(
it.toString(),
it.?) // what to use here?
.build())
.build())
}
Как я могу найти тип поля? Я прочитал в документации, что вы должны использовать метод asType()
но это вернуть экземпляр TypeMirror
, Я действительно не вижу, как продолжить отсюда. Любые предложения приветствуются.
1 ответ
Решение
Я в конечном итоге с помощью этой функции:
private fun getClass(it: VariableElement): KClass<*> {
val type = it.asType()
return when (type.kind) {
TypeKind.DECLARED -> Class.forName(type.toString()).kotlin
TypeKind.BOOLEAN -> Boolean::class
TypeKind.BYTE -> Byte::class
TypeKind.SHORT -> Short::class
TypeKind.INT -> Int::class
TypeKind.LONG -> Long::class
TypeKind.CHAR -> Char::class
TypeKind.FLOAT -> Float::class
TypeKind.DOUBLE -> Double::class
else -> throw Exception("Unknown type: $type, kind: ${type.kind}")
}
}