在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
}