如何获取 javax.lang.model.element.Element 实例的类型

How to get the type of an instance of javax.lang.model.element.Element

我正在关注 Hello World of Annotation Processing in Kotlin and KotlinPoet's documentation 并正在尝试为 Kotlin 实现通用构建器。我想一般地为带注释的数据 class 中的每个字段创建一个方法,并为其参数指定与字段相同的名称和类型。问题是,鉴于我拥有 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())
            }

如何找到字段的类型?我在 documentation 中读到您应该使用方法 asType(),但是这个 return 是 TypeMirror 的一个实例。我真的看不出如何从这里继续。欢迎提出任何建议。

我最终使用了这个函数:

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}")
    }
}
.addMember("%N", "${it.asType()}::class")