如何使用 KotlinPoet 为 PropertySpec 获取正确的 TypeName

Posted

技术标签:

【中文标题】如何使用 KotlinPoet 为 PropertySpec 获取正确的 TypeName【英文标题】:How to use KotlinPoet to get correct TypeName for PropertySpec 【发布时间】:2021-07-08 17:33:19 【问题描述】:

使用 KotlinPoet,为了生成用于向类和构造函数添加属性的 PropertySpec,您需要一个 TypeName 对象。

TypeMirror.asTypeName() KotlinPoet 函数已弃用,因为它并不总是适用于 Kotlin 类型。

但我找不到一个示例,说明如何使用 kotlinpoet-metadata API 为 Kotlin 类(例如 kotlin.String)获取正确的 TypeName,就像弃用消息所说的那样。

kotlinpoet-metadata API 的文档似乎也完全损坏了(转到 https://square.github.io/kotlinpoet/interop-kotlinx-metadata/#interop-with-kotlinx-metadata 并单击 API 部分下的任何内容)

有没有人举例说明如何用一些 kotlinpoet 元数据代码替换 TypeMirror.asTypeName() 以获得 TypeName,以便我可以创建 PropertySpec?

【问题讨论】:

您是否事先知道您所指的类,或者该类是由您的注释处理器确定的并且它只能作为 TypeMirror 使用? 该类在处理器中作为注释元素提供,所以我只有一个类型镜像。我知道在这种情况下,当前的破损是一个字符串。 asTypeName 总是产生 java.lang.String,但我需要 kotlin.String。 API 文档的正确链接:interop-kotlinx-metadata-classinspectors-elements,interop-kotlinx-metadata-classinspectors-reflect,interop-kotlinx-metadata-core,interop-kotlinx-metadata-specs 概述部分也缺少一个链接:KotlinPoet-metadata-specs 当类由注释处理器确定并且只能作为 TypeMirror 使用时,是否有可用的示例?链接似乎是 404。谢谢! 【参考方案1】:

不太确定这是否符合弃用消息的意图,但这就是我让它起作用的原因。

我首先必须添加 kotlinpoet-metadata-specs。

implementation("com.squareup:kotlinpoet:1.7.1")
implementation("com.squareup:kotlinpoet-metadata:1.7.1")
implementation("com.squareup:kotlinpoet-metadata-specs:1.7.1")

然后使用com.squareup.kotlinpoet.metadata.specs.internal.ClassInspectorUtil 中的 util 方法创建类名。

val packageName = getPackage(element).qualifiedName.toString()
val typeMetadata = element.getAnnotation(Metadata::class.java)
val kmClass = typeMetadata.toImmutableKmClass()
val className = ClassInspectorUtil.createClassName(kmClass.name)

然后使用

val funSpec = FunSpec.builder("allNullableSet")
                     .receiver(className)
                     .returns(Boolean::class.java)
                     .addStatement(statement)
                     .build()

【讨论】:

谢谢,这很有用,但 ClassInspectorUtil 在 kotlinpoet 中被标记为 internal。我想知道是否有办法使用公共 API 从ImmutableKmClass 获取TypeName

以上是关于如何使用 KotlinPoet 为 PropertySpec 获取正确的 TypeName的主要内容,如果未能解决你的问题,请参考以下文章

类的 propert,classmethod,ataticmethod 方法 与 多态

python - class propert应用

-Dmaven.multiModuleProjectDirectory system propert

JavaPoet使用攻略

Mybatismybatis查询报错org.apache.ibatis.reflection.ReflectionException: There is no getter for propert(代

使用 Oracle Java ORB 使用命名服务查找时如何指定网络接口