在Android Studio中,項(xiàng)目編譯build之后kapt會(huì)在項(xiàng)目的build/tmp/kapt3/stubs目錄下會(huì)生成kotlin編寫的類的Java“存根類”,在這些類的頂部我們可以看到有這樣一個(gè)注解@kotlin.Metadata(...)
@Metadata是 Kotlin 里比較特殊的一個(gè)注解。它記錄了 Kotlin 代碼元素的一些信息,比如 class 的可見性,function 的返回值,參數(shù)類型,property 的 lateinit,nullable 的屬性等等。這些 Metadata 的信息由 kotlinc 生成,最終會(huì)以注解的形式存于 .class 文件。
所以要在注解處理器判斷一個(gè)類是kotlin語言或者Java語言編寫的我們可以通過判斷該類是否有@Metadata注解來區(qū)分:
/**
* if true mean this class is java class
*/
private fun isJavaFile(element: TypeElement): Boolean {
val tmMetadata = mElements.getTypeElement("kotlin.Metadata").asType()
return element.annotationMirrors.find { it.annotationType == tmMetadata } == null
}