2016-10-01 23 views
10

如果遇到Kotlin類與泛型Java類相比,我想要做特殊功能。我如何檢測它是否是Kotlin類?我想檢測JVM類是否是Kotlin類

我當時希望調用someClass.kotlin會拋出異常,否則如果該類不是Kotlin。但它包裝Java類很好。然後我注意到,如果我做someClass.kotlin.primaryConstructor它似乎是null所有的java類,即使他們有一個默認的構造函數,是一個好的標記?但是,Kotlin課程也可以返回null嗎?

什麼是最好的方式來說「這是一個Kotlin類?」

回答

10

Kotlin爲其所有類添加註釋,並且可以安全地按名稱檢查其存在。這是一個實現細節,可能會隨着時間而改變,但一些關鍵的庫使用這個註釋,所以它可能會無限期地確定。

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

可作爲:

someClass.isKotlinClass() 

kotlin.Metadata,因爲它標誌着在科特林運行internal不直接訪問。

+0

爲什麼不直接比較類? 'it.annotationClass == Metadata :: class' – Raman

+1

該類不可訪問,是'internal' –

+0

啊。它似乎可以從Java訪問。例如,我爲Spring框架寫了這個(未合併的)拉取請求:https://github.com/spring-projects/spring-framework/pull/1060/files#diff-244315b45582a5b7573a15644b16c373R48(是的,他們希望它用Java編寫,eek)。 – Raman