Kotlin
KAPT
KAPT annotation processing'i öğrenirsin.
KAPT nedir?
KAPT (Kotlin Annotation Processing Tool), Kotlin için eski annotation işleme yoludur. Kotlin kodunu önce Java'ya dönüştürür, sonra Java'nın annotation processor'ını çalıştırır.
KAPT, javax.annotation.processing.Processor arabirimini kullanır. Dagger, ButterKnife ve eski Room gibi kütüphaneler KAPT kullanır. Kotlin'i Java'ya dönüştürme adımı zaman alır; bu yüzden KAPT yavaştır. Yeni projelerde KSP önerilir. Eski bağımlılıklar nedeniyle KAPT hala gerekliyse kapt(...) bağımlılığı eklenir ve kapt plugin'i etkinleştirilir.
KAPT processor örneği
Bir KAPT processor'ı AbstractProcessor'dan türer ve process(annotations, roundEnv) metodunu uygular. Bu yapı Java'dan gelir.
Örnek: class EntityProcessor : AbstractProcessor() { override fun process(annotations: Set<TypeElement>, roundEnv: RoundEnvironment): Boolean { ... } }. Burada roundEnv üzerinden annotation'lı öğeler bulunur. İşleyici, her öğe için Filer ile kaynak dosyası yazar. Bu yapı Java standartlarına dayanır; Kotlin'e özgü değildir. Bu yüzden KSP, KAPT'den hem daha hızlı hem de Kotlin'e daha uygundur.
Uygulama KaptProcessor yaz
KaptProcessor sınıfı tanımla. fun process(annotations: List<String>) metodu, her annotation için println("apt: $it") çağrısı yapsın. main içinde listOf("Entity", "Dao") ile çağır.
Örnek çözümü göster
class KaptProcessor {
fun process(annotations: List<String>) {
for (it in annotations) println("apt: $it")
}
}
fun main() {
KaptProcessor().process(listOf("Entity", "Dao"))
}
Kendini test et
-
KAPT parçalarını eşle
- KAPT
- Eski işleme yolu
- javax.annotation.processing
- Java APT arabirimi
- kapt plugin
- Gradle eklentisi
- kapt(...)
- Bağımlılık
-
KAPT neden yavaştır?
- Reflection kullanır
- Coroutine başlatır
- Her seferinde ağ bağlantısı açar
- Kotlin'i önce Java'ya dönüştürür
Cevabı göster
Kotlin'i önce Java'ya dönüştürür — KAPT, Kotlin'i Java'ya dönüştürme adımı yüzünden yavaştır.
-
KAPT processor sınıfını tamamla
class EntityProcessor : ____() {
override fun process(annotations: Set<TypeElement>, roundEnv: RoundEnvironment): Boolean {
return true
}
}
Cevabı göster
class EntityProcessor : AbstractProcessor() {
override fun process(annotations: Set<TypeElement>, roundEnv: RoundEnvironment): Boolean {
return true
}
}
Sıradaki ders: KSP vs KAPT