如何获取 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")
我正在关注 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")