我正在实现注释处理库,该库使用基于具有特定注释的类的java诗来生成代码。
为了消耗用kotlin编写的类,我在我的示例项目中切换到了kapt而不是apt。它适用于带注释的java-classes。 Bun kotlin-classes在访问类字段时有不同的方法:应该使用getter和setter。
有没有办法确定给定的类(更具体地说 - 不是类而不是TypeElement - 因为这是在编译之前发生的)是java-class还是用kotlin编写的?基于此,我可以编写生成字段访问或访问者访问的代码。
答案 0 :(得分:4)
理论上,从kotlin编译的任何类都将使用kotlin.Metadata
进行注释。
您可以使用getAnnotation
上的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")
}