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

Kotlin 如何获取javax.lang.model.element.element实例的类型,kotlin,kotlinpoet,Kotlin,Kotlinpoet,我正在关注并尝试为Kotlin实现一个通用生成器。我希望为带注释的数据类中的每个字段创建一个方法,并为其参数指定相同的字段名称和类型。问题是,给定我拥有的javax.lang.model.element.element实例,我无法找到该字段的类型。以下是我迄今为止所做的: fieldsIn(klass.enclosedElements) .forEach { classBuilder .add

我正在关注并尝试为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
的实例。我真的不知道如何从这里继续下去。欢迎提出任何建议。

我最终使用了以下功能:

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}")
    }
}
private-fun-getClass(it:variablelement):KClass{
val type=it.asType()
返回时间(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->抛出异常(“未知类型:$type,kind:${type.kind}”)
}
}

您需要添加一些解释。仅发布代码可能没有帮助问题是从类型中获取cKlass,这可以按照作者的回答中所述进行,但是Class.forName()仅在处理器模块知道您尝试创建的cKlass时才起作用。在我的情况下,情况并非如此,而是通过设置名称“%N”而不是类型“%T”并仅添加一个“::class”字符串来解决问题。如何获取该类型是可为null的还是不可为null的?例如,如何知道变量的类型是“String”还是“String”,那么像
List
这样的参数化类型呢?
.addMember("%N", "${it.asType()}::class")