我正在关注Hello World of Annotation Processing in Kotlin和KotlinPoet's documentation,并试图为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())
}
如何找到字段类型?我在documentation中读到,您应该使用方法asType()
,但这将返回TypeMirror
的实例。我真的看不到如何从这里继续。欢迎任何建议。
答案 0 :(得分:0)
我最终使用了此功能:
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}")
}
}
答案 1 :(得分:0)
.addMember("%N", "${it.asType()}::class")