如何在 KotlinPoet 中生成方法 return 类型的生成 class?
How to make method return type of generated class in KotlinPoet?
我需要在 KotlinPoet
的帮助下生成 Builder
class。为此,我需要将方法 return 设为 Builder
类型。我通过以下方式进行:
private fun generateInitUserBehaviorClass() = TypeSpec.classBuilder("Init")
.addType(generateInitBuilderClass())
.build()
private fun generateInitBuilderClass() = TypeSpec.classBuilder("Builder")
.addProperty(generateInitBuilderEndpointProperty())
.addFunction(generateInitBuilderEndpointSetter())
.build()
private fun generateInitBuilderEndpointProperty() = PropertySpec.builder(
"endpoint",
Class.forName("android.net.Uri").asTypeName().copy(nullable = true),
KModifier.PRIVATE
).mutable(true)
.initializer("null")
.build()
private fun generateInitBuilderEndpointSetter() = FunSpec.builder("setEndpoint")
.addParameter("endpoint", Class.forName("android.net.Uri"))
.returns(Class.forName("com.idfinance.userbehavior.utils.Init.Builder"))
.build()
但是当我构建模块时,我发现 Class.forName("com.idfinance.userbehavior.utils.Init.Builder")
找不到 class Builder
的错误。该包是正确的,据我所知,问题是我在 class 尚未生成时尝试将其用作 return 类型。但是我该如何解决这个问题呢?
您可以使用其 constructor 实例化一个 ClassName
,它不必是已声明的 class:
private fun generateInitBuilderEndpointSetter() = FunSpec.builder("setEndpoint")
.addParameter("endpoint", ClassName("android.net", "Uri"))
.returns(ClassName("com.idfinance.userbehavior.utils", "Init", "Builder"))
.build()
我需要在 KotlinPoet
的帮助下生成 Builder
class。为此,我需要将方法 return 设为 Builder
类型。我通过以下方式进行:
private fun generateInitUserBehaviorClass() = TypeSpec.classBuilder("Init")
.addType(generateInitBuilderClass())
.build()
private fun generateInitBuilderClass() = TypeSpec.classBuilder("Builder")
.addProperty(generateInitBuilderEndpointProperty())
.addFunction(generateInitBuilderEndpointSetter())
.build()
private fun generateInitBuilderEndpointProperty() = PropertySpec.builder(
"endpoint",
Class.forName("android.net.Uri").asTypeName().copy(nullable = true),
KModifier.PRIVATE
).mutable(true)
.initializer("null")
.build()
private fun generateInitBuilderEndpointSetter() = FunSpec.builder("setEndpoint")
.addParameter("endpoint", Class.forName("android.net.Uri"))
.returns(Class.forName("com.idfinance.userbehavior.utils.Init.Builder"))
.build()
但是当我构建模块时,我发现 Class.forName("com.idfinance.userbehavior.utils.Init.Builder")
找不到 class Builder
的错误。该包是正确的,据我所知,问题是我在 class 尚未生成时尝试将其用作 return 类型。但是我该如何解决这个问题呢?
您可以使用其 constructor 实例化一个 ClassName
,它不必是已声明的 class:
private fun generateInitBuilderEndpointSetter() = FunSpec.builder("setEndpoint")
.addParameter("endpoint", ClassName("android.net", "Uri"))
.returns(ClassName("com.idfinance.userbehavior.utils", "Init", "Builder"))
.build()