【问题标题】:kotlin annotation processing: check if given TypeElement is from kotlin-classkotlin 注释处理:检查给定的 TypeElement 是否来自 kotlin-class
【发布时间】:2017-12-18 17:27:04
【问题描述】:

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

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

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

【问题讨论】:

  • 没有编辑建议的不赞成投票,没有评论......什么都没有。这应该怎么用?

标签: java kotlin kapt


【解决方案1】:

理论上,从 kotlin 编译的任何类都将使用 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") 
}

【讨论】:

  • 编译器说我们不能指定该类来获取注释:它具有内部可见性
  • 你要么需要使用反射,要么用Java编写检查,因为internal在处理java互操作时会变成public
  • 或者...我设法解决了isKotlinClass使用这种方法检查:isKotlinClass = elementUtils.getAllAnnotationMirrors(typeElement).any { (it.annotationType.asElement() as TypeElement).qualifiedName.toString() == "kotlin.Metadata" }
  • 顺便说一句,上面的示例(一旦重写为 Java)允许在不添加 kotlin 依赖项的情况下确定 isKotlinClass,这很方便。
  • 添加了一个使用Elements提取注解名称的版本。
猜你喜欢
  • 1970-01-01
  • 2023-03-04
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 2017-05-22
相关资源
最近更新 更多