
KotlinPoetでHello Worldする
はじめに
KotlinPoetとはKotlinのソースコードを生成するためのライブラリです。KotlinFest 2019でKotlinPoetに関する発表があり、早速使ってみています。
KotlinPoetによるソースコードの生成
名前と会社名のプロパティと挨拶用の関数を持つパーソンクラス、それを呼び出すメイン関数を生成してみます。
package jp.co.casareal.hello
import com.squareup.kotlinpoet.FileSpec
import com.squareup.kotlinpoet.FunSpec
import com.squareup.kotlinpoet.KModifier
import com.squareup.kotlinpoet.ParameterSpec
import com.squareup.kotlinpoet.PropertySpec
import com.squareup.kotlinpoet.TypeSpec
fun main() {
// ビルダーの作成
val typeSpecBuilder = TypeSpec.classBuilder("Person")
.addModifiers(KModifier.DATA)
// コンストラクタ
typeSpecBuilder.primaryConstructor(
FunSpec.constructorBuilder()
.addParameters(
listOf(
ParameterSpec.builder("name", String::class).build(),
ParameterSpec.builder("company", String::class).build()
)
).build()
)
// プロパティ
typeSpecBuilder.addProperties(
listOf(
PropertySpec.builder("name", String::class).initializer("name").build(),
PropertySpec.builder("company", String::class).initializer("company").build()
)
)
// 関数
typeSpecBuilder.addFunction(
FunSpec.builder("greeting")
.addStatement("""println("こんにちは!%Lの%Lです。")""", "\${this.company}", "\${this.name}").build()
)
// ビルド
val typeSpec = typeSpecBuilder.build()
// メイン関数の生成
val mainFunction = FunSpec.builder("main").addCode("""
Person("森","カサレアル").greeting()
""".trimIndent()).build()
// ファイルの作成
val fileSpec = FileSpec
// パッケージ名とファイル名
.builder("jp.co.casareal.hello", "Person")
// クラスの追加
.addType(typeSpec)
// 関数の追加
.addFunction(mainFunction)
.build()
fileSpec.writeTo(System.out)
}生成されたコード
実行すると以下のコードが出力されます。
package jp.co.casareal.hello
data class Person(
val name: String,
val company: String
) {
fun greeting() {
println("こんにちは!${this.company}の${this.name}です。")
}
}
fun main() {
Person("森", "カサレアル").greeting()
}
おわりに
公式サイトが充実しているので困ったら公式サイト見るとだいたいのことは解決できると思います。
今回はサンプルなので簡単なものしか生成していませんが、Spring Frameworkを使ってバックエンドの開発をしているときに、KotlinPoetを使ってDBのメタ情報からController,Service,Repositoryの各レイヤーのベースを生成する使い方をしています。
同じようなコードを大量に実装する場合にKotlinPoetを使えば楽ができそうですね。