Generated code
- Kotlin kursu
- Uzman
- Ders 11/47
- 5 dk
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
// generateClass metodunu ekle
fun main() {
// User ve Order için üret ve yazdır
}Örnek çözüm
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
fun generateClass(name: String): String {
return "class ____(val id: Int)"
}
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 |