默认转换器
本指南介绍插件提供的默认转换器以及如何有效使用它们。
概述
转换器是定义挂起函数如何为不同平台转换的核心组件。 插件提供了几个内置转换器,涵盖了最常见的用例。
默认转换器依赖于插件提供的 annotation
和 runtime
依赖项。
在使用默认转换器之前,请确保在配置中包含它们。
JVM 转换器
JVM 阻塞转换器
JVM 阻塞转换器使用 runBlocking
生成挂起函数的阻塞变体。
配置
suspendTransformPlugin {
transformers {
// 方式 1:简单添加
addJvmBlocking()
// 方式 2:使用配置对象
addJvm(SuspendTransformConfigurations.jvmBlockingTransformer)
// 方式 3:使用平台特定添加
add(
TargetPlatform.JVM,
SuspendTransformConfigurations.jvmBlockingTransformer
)
}
}
用法
- 源代码
- 编译后
class ApiService {
@JvmBlocking
suspend fun fetchData(): String {
delay(1000)
return "Data fetched"
}
}
class ApiService {
@JvmSynthetic
suspend fun fetchData(): String {
delay(1000)
return "Data fetched"
}
@Api4J
fun fetchDataBlocking(): String =
`$runInBlocking$` { fetchData() }
}
主要特性
- 默认生成函数后缀:
Blocking
- 返回类型:与原函数相同
- 运行时函数:
$runInBlocking$
(基于kotlinx.coroutines.runBlocking
)
标记注解
@JvmBlocking
提供一些属性来更改默认值并自定义生成的函数结果。
baseName
baseName
表示生成函数的基本名称。
默认情况下,它是空的(""
)。如果值为空,意味着使用与原函数相同的值。
生成函数的最终函数名是 baseName
+ suffix
。
suffix
suffix
表示生成函数的后缀。
默认情况下,它是 Blocking
。
asProperty
asProperty
表示是否生成属性而不是函数。
默认情况下,它是 false
。
suspend fun foo(): T = ...
// 生成的
@Api4J
val fooBlocking: T
get() = runInBlocking { foo() }
如果 asProperty
为 true
,函数不能有参数。
markName
参考 MarkName。
JVM 异步转换器
JVM 异步转换器使用 CompletableFuture
生成异步变体。
配置
suspendTransformPlugin {
transformers {
// 方式 1:简单添加
addJvmAsync()
// 方式 2:使用配置对象
addJvm(SuspendTransformConfigurations.jvmAsyncTransformer)
// 方式 3:使用平台特定添加
add(
TargetPlatform.JVM,
SuspendTransformConfigurations.jvmAsyncTransformer
)
}
}
用法
- 源代码
- 编译后
class ApiService {
@JvmAsync
suspend fun fetchData(): String {
delay(1000)
return "Data fetched"
}
}
class ApiService {
@JvmSynthetic
suspend fun fetchData(): String {
delay(1000)
return "Data fetched"
}
@Api4J
fun fetchDataAsync(): CompletableFuture<out String> =
`$runInAsync$`(
block = { fetchData() },
scope = this as? CoroutineScope
)
}
主要特性
- 默认生成函数后缀:
Async
- 返回类型:
CompletableFuture<out T>
,其中 T 是原返回类型 - 运行时函数:
$runInAsync$
- 作用域处理:如果可用,使用当前
CoroutineScope
,否则使用GlobalScope
标记注解
@JvmAsync
提供一些属性来更改默认值并自定义生成的函数结果。
baseName
baseName
表示生成函数的基本名称。
默认情况下,它是空的(""
)。如果值为空,意味着使用与原函数相同的值。
生成函数的最终函数名是 baseName
+ suffix
。
suffix
suffix
表示生成函数的后缀。
默认情况下,它是 Async
。
asProperty
asProperty
表示是否生成属性而不是函数。
默认情况下,它是 false
。
suspend fun foo(): T = ...
// 生成的
@Api4J
val fooAsync: CompletableFuture<out T>
get() = runInAsync { foo() }
如果 asProperty
为 true
,函数不能有参数。
markName
参考 MarkName。
JavaScript 转换器
JS Promise 转换器
JS Promise 转换器为 JavaScript 互操作性生成基于 Promise 的变体。
配置
suspendTransformPlugin {
transformers {
// 方式 1:简单添加
addJsPromise()
// 方式 2:使用配置对象
addJs(SuspendTransformConfigurations.jsPromiseTransformer)
// 方式 3:使用平台特定添加
add(
TargetPlatform.JS,
SuspendTransformConfigurations.jsPromiseTransformer
)
}
}
用法
- 源代码
- 编译后
class ApiService {
@JsPromise
suspend fun fetchData(): String {
delay(1000)
return "Data fetched"
}
}
class ApiService {
suspend fun fetchData(): String {
delay(1000)
return "Data fetched"
}
@Api4Js
fun fetchDataAsync(): Promise<String> =
`$runInAsync$`(
block = { fetchData() },
scope = this as? CoroutineScope
)
}
主要特性
- 默认生成函数后缀:
Async
- 返回类型:
Promise<T>
,其中 T 是原返回类型 - 运行时函数:
$runInAsync$
标记注解
@JsPromise
提供一些属性来更改默认值并自定义生成的函数结果。
baseName
baseName
表示生成函数的基本名称。
默认情况下,它是空的(""
)。如果值为空,意味着使用与原函数相同的值。
生成函数的最终函数名是 baseName
+ suffix
。
suffix
suffix
表示生成函数的后缀。
默认情况下,它是 Async
。
asProperty
asProperty
表示是否生成属性而不是函数。
默认情况下,它是 false
。
suspend fun foo(): T = ...
// 生成的
@Api4Js
val fooAsync: Promise<T>
get() = runInAsync { foo() }
如果 asProperty
为 true
,函数不能有参数。
markName
参考 MarkName。
便利函数
组合 JVM 转换器
suspendTransformPlugin {
transformers {
// 包括 addJvmBlocking() 和 addJvmAsync()
useJvmDefault()
}
}
这等同于:
suspendTransformPlugin {
transformers {
addJvmBlocking()
addJvmAsync()
}
}
组合 JS 转换器
suspendTransformPlugin {
transformers {
// 包括 addJsPromise()
useJsDefault()
}
}
所有默认转换器
suspendTransformPlugin {
transformers {
// 包括所有平台的所有默认转换器
useDefault()
}
}
这等同于:
suspendTransformPlugin {
transformers {
useJvmDefault() // JVM 阻塞 + JVM 异步
useJsDefault() // JS Promise
}
}
组合多个注解
您可以在同一个函数上使用多个转换器注解:
class ApiService {
@JvmBlocking
@JvmAsync
@JsPromise
suspend fun fetchData(): String {
delay(1000)
return "Data fetched"
}
}
这将生成:
fetchDataBlocking(): String
(JVM)fetchDataAsync(): CompletableFuture<out String>
(JVM)fetchDataAsync(): Promise<String>
(JS)