CodeBlanks Logo Icon CodeBlanks

Generated code

KSP ile kod üretimini öğrenirsin.

Üretilen kod nereye gider?

Bir KSP processor, ürettiği kodu codeGenerator üzerinden build/generated/ksp/... klasörüne yazar. Bu dosyalar derlemeye dahil edilir.

Örnek: codeGenerator.createNewFile(...) ile bir dosya açılır, içine Kotlin kaynak kodu yazılır ve kapatılır. Sonraki derlemede bu kod normal bir kaynak gibi derlenir. Bu, runtime'da reflection yapmadan typed API'ler oluşturmanın yoludur. Room'un Dao implementasyonu, Moshi'nin adapter'ları bu şekilde üretilir. Üretilen kodu incelemek için build klasörüne bakabilirsin.

Bir kod üreteci örneği

Basit bir kod üreteci, bir sınıf adı alır ve o sınıfın bir Kotlin kaynak dosyasını üretir. Bu, KSP'nin codeGenerator'üne yazılacak metni hazırlar.

Örnek: fun generateClass(name: String): String = "class $name(val id: Int)". Bu fonksiyon "User" alırsa "class User(val id: Int)" döner. Gerçek KSP'de bu metin codeGenerator.createNewFile(...) ile yazılır. Burada metnin kendisini hazırlamaya odaklanıyoruz. Üretilen metnin geçerli Kotlin olması gerekir; yoksa sonraki derleme başarısız olur.

Uygulama generateClass yaz

fun generateClass(name: String): String tanımla. "class $name(val id: Int)" döndürsün. main içinde generateClass("User") ve generateClass("Order") çağrılarının sonuçlarını ayrı satırlarda yazdır.

Başlangıç kodu

Main.kt
// generateClass metodunu ekle

fun main() {
    // User ve Order için üret ve yazdır
}

Örnek çözüm

Main.kt
fun generateClass(name: String): String = "class $name(val id: Int)"
fun main() {
    println(generateClass("User"))
    println(generateClass("Order"))
}

Beklenen çıktı

class User(val id: Int)
class Order(val id: Int)

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Üretilen kod ne zaman derlenir?

  • Derleme aşamasında, ana kaynaklarla birlikte Doğru cevap
  • Runtime'da, uygulama çalışınca
  • Yalnızca test koşarken
  • Asla derlenmez; yorum olarak kalır

Açıklama: Üretilen kod ana kaynaklarla aynı derleme aşamasında derlenir.

2 generateClass metodunu tamamla

Soru
fun generateClass(name: String): String {
    return "class ____(val id: Int)"
}
Cevap
fun generateClass(name: String): String {
    return "class $name(val id: Int)"
}

Açıklama: $name ile her sınıf adı dinamik üretilir.

3 Üretim parçalarını eşle

Kavram Anlamı
codeGenerator Dosya yazma
createNewFile Yeni dosya açma
build/generated Çıktı klasörü
generateClass Metin üretme

Uzman bölümündeki tüm dersler