kotlin 注释处理:检查给定的 TypeElement 是否来自 kotlin-class

kotlin annotation processing: check if given TypeElement is from kotlin-class

我正在实施注释处理库,该库使用 java poet 基于具有特定注释的 classes 生成代码。

为了也使用用 kotlin 编写的 classes,我在我的示例项目中切换到 kapt 而不是 apt。它适用于带注释的 java-classes 就好了。 Bun kotlin-classes 使用不同的方法访问 class 字段:应该使用 getter 和 setter。

有没有办法确定给定的 class(更具体地说 - 不是 class 而是 TypeElement - 因为这是在编译之前发生的)是否是 java-class 还是用 kotlin 写的?基于此,我可以编写生成字段访问或使用 getter 访问的代码。

理论上,任何从 kotlin 编译的 class 都会被注释为 kotlin.Metadata。 您可以在 TypeElement 上使用 getAnnotation 方法来检查该注释是否存在,以验证它们是否是用 kotlin 编写的。

val metaDataClass = Class.forName("kotlin.Metadata").asSubclass(Annotation::class.java)
val isKotlinClass = <TypeElement>.getAnnotation(metaDataClass) != null

在处理环境中没有 kotlin 标准库的情况下工作的版本:

elementUtils.getAllAnnotationMirrors(typeElement).any { 
    elementUtils.getBinaryName(it.annotationType).contentEquals("kotlin.Metadata") 
}