2

我正在实现注释处理库,该库使用基于具有特定注释的类的 Java Pot 生成代码。

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

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

4

1 回答 1

5

理论上,从 kotlin 编译的任何类都将使用kotlin.Metadata. 您可以使用getAnnotationon 方法TypeElement检查该注释是否存在,以验证它们是否是用 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") 
}
于 2017-12-18T18:27:51.590 回答