2

我正在关注Kotlin和KotlinPoet 文档中的 Hello World of Annotation Processing,并尝试为 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. 我真的不知道如何从这里继续。欢迎任何建议。

4

2 回答 2

3

我最终使用了这个功能:

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}")
    }
}
于 2018-10-22T06:01:21.667 回答
0
.addMember("%N", "${it.asType()}::class")
于 2019-03-04T21:45:15.417 回答