与@Repeatable @Retention(AnnotationRetention.Source)一起使用时,roundEnv.getElementsAnnotatedWith(AnnotationName :: class.java)反射是否断开

时间:2019-07-05 23:47:04

标签: android kotlin kotlinpoet

使用kapt / kotlinpoet在Android Studio中构建AbstractProcessor时。当我尝试使用可重复注释标签时,它停止从roundEnv.getElementsAnnotatedWith(AnnotationName :: class.java)获取数据,如果可重复标签已从注释中删除,我可以获取已注释的类信息

要尝试使用其他反射方式

@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.SOURCE)
@Repeatable // <-- issue 
annotation class ConfigurableGroup(
    val key: String,
    val text: String
)
// the processor abbreviated

@AutoService(Processor::class)
@SupportedSourceVersion(SourceVersion.RELEASE_8)
@SupportedOptions(AnnotationProcessorNew.
KAPT_KOTLIN_GENERATED_OPTION_NAME)
class AnnotationProcessorNew : AbstractProcessor(){

override fun process(annotations: MutableSet<out TypeElement>, roundEnv: 
RoundEnvironment): Boolean {
    return generateConfigurables(roundEnv)
}

override fun getSupportedAnnotationTypes(): MutableSet<String> {
    return mutableSetOf(
ConfigurableGroup::class.java.name
}

roundEnv.getElementsAnnotatedWith(ConfigurableGroup::class.java)
       .filter { it.kind == ElementKind.CLASS }
       .forEach { classElement ->

          val classPackageName = 
processingEnv.elementUtils.getPackageOf(classElement).toString()
               val classSimpleName = classElement.simpleName.toString()

无论注解是否带有@repeatable标记,我都希望两次都从反射中获取数据。

1 个答案:

答案 0 :(得分:0)

Kotlin的@Repeatable注释似乎纯粹是工具提示,与Java的@Repeatable合同不符。

似乎Java合同要求定义一个容器批注,以便可以将重复的批注打包为单个批注以供批注处理器检索。

您需要为容器注释显式添加@java.lang.annotation.Repeatable(ConfigurableGroups::class)并接受其生成的警告,或者使用Java而不是Kotlin定义注释。