Gradle Groovy 和 Kotlin kts 语法对比
Groovy 和 Kotlin kts 对比
1. 创建配置
下面是 Android 签名类型:
android {productFlavors {// 创建 prod 名的配置prod {}}
}
- 在 kts 中,prod可能需要显示调用:create("prod")
- 在 groovy 中,基于 元编程 和 拦截机制,对于不存在 prod 的方法,会调用 invokeMethod(),最后调用create完成创建。
2. 赋值 和 调用
Groovy 中 prop 123 可以是 调用函数,也可以是 属性 赋值。
 kts 中要处理:
- prop(123)
- prop = 123 或 setProp(123)
org.gradle.api.provider.Property
Property<T> 有 get() set(T) 方法,Groovy赋值运算同样可以简化为:
prop = 123
- kts 也可以=直接赋值,因为实现了=运算符重载:org.gradle.api.provider.Property<T>.assign(value: T?)
属性赋值
- Groovy 只要有 setter或getter 方法,都可认作 属性,并且 set 可以有多个 类型。
- 而 Kotlin setter/getter 类型一致时,才 作为属性。
以下对比下区别:
repositories {maven { url 'https://jitpack.io' }
}// get/setUrl 是 URI 类型, kts 则要写成
repositories {maven { setUrl("https://jitpack.io") }// 或maven { url = uri("https://jitpack.io") }
}
3. 方法调用 和 命名参数
Groovy 方法调用可以 省去 括号。
而 Kotlin 方法调用 则是 infix 函数才能省去括号。
常见的设置 gradle插件 代码:
// Groovy
apply plugin: 'java'
// 完整形式:apply(plugin: 'java')// kotlin
apply(plugin = "java")
4. 强类型
tasks.create 创建任务需要明确类型:
// Groovy 弱类型
tasks.create("copyFile") {}// Kotlin 强类型
tasks.create<Copy>("copyFile") {....
}
字段/方法 缺省调用
动态调用,maybeCreate
- 缺少方法,则会 调用 invokeMethod()或methodMissing()方法
- 缺少字段,则会 调用 getProperty()或propertyMissing()方法

文档参考
- https://groovy-lang.org/objectorientation.html#properties
- https://docs.groovy-lang.org/latest/html/documentation/#_methodmissing
- https://docs.groovy-lang.org/latest/html/documentation/#_propertymissing
- invokeMethod https://groovy-lang.org/single-page-documentation.html
- Working with Gradle types
