2016-10-01 15 views
10

Genel bir Java sınıfıyla karşılaştırıldığında bir Kotlin sınıfı ile karşılaşırsam özel işlevsellik yapmak istiyorum. Kotlin sınıfı olup olmadığını nasıl anlayabilirim?Bir JVM Sınıfı'nın bir Kotlin sınıfı olup olmadığını belirlemek istiyorum

someClass.kotlin numaralı telefonun aranmasının bir istisna fırlatacağını veya sınıf Kotlin değilse başarısız olacağını umuyordum. Ama Java sınıflarını güzelce sarar. Daha sonra, someClass.kotlin.primaryConstructor yaparsam, varsayılan bir kurucuya sahip olsalar bile tüm java sınıfları için null gibi görünüyor, bu iyi bir işaretleyici mi olduğunu fark ettim. Ama bu da bir Kotlin sınıfı için null'u geri alabilir mi?

"Bu bir Kotlin sınıfı mıdır?" Demenin en iyi yolu nedir?

cevap

10

Kotlin, tüm sınıflarına bir açıklama ekler ve varlığını isme göre güvenle kontrol edebilirsiniz. Bu bir uygulama detayıdır ve zaman içinde değişebilir, ancak bazı önemli kütüphaneler bu notu kullanırlar, bu nedenle süresiz olarak tamamlanma olasılığı yüksektir.

fun Class<*>.isKotlinClass(): Boolean { 
    return this.declaredAnnotations.any { 
     it.annotationClass.qualifiedName == "kotlin.Metadata" 
    } 
} 

kullanılabilir olarak:

o Kotlin çalışma zamanında internal işaretlendiği için sınıf kotlin.Metadata doğrudan erişilmez
someClass.isKotlinClass() 

.

+0

Neden sınıfı doğrudan karşılaştırmıyorsunuz? 'it.annotationClass == Metadata :: class' – Raman

+1

Sınıf erişilebilir değil, 'internal' –

+0

Ah. Java'dan erişilebilir gibi görünüyor. Örneğin, Spring Framework için bu (koşulsuz) çekme talebini yazdım: https://github.com/spring-projects/spring-framework/pull/1060/files#diff-244315b45582a5b7573a15644b16c373R48 (evet, Java'da yazılmasını istediler eek). – Raman