当与 @Repeatable @Retention(AnnotationRetention.Source) 一起使用时,roundEnv.getElementsAnnotatedWith(AnnotationName::class.java) 反射是否中断
Is roundEnv.getElementsAnnotatedWith(AnnotationName::class.java) reflection broken when used with a @Repeatable @Retention(AnnotationRetention.Source)
在 Android studio 中使用 kapt/kotlinpoet 构建 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 标记,我都希望从反射中获取数据。
Kotlin 的 @Repeatable
注释似乎纯粹是工具提示,与 Java 的 @Repeatable
约定不匹配。
似乎java合约需要定义一个容器注解,以便将重复的注解打包为单个注解,供注解处理器检索。
您需要为容器注释显式添加 @java.lang.annotation.Repeatable(ConfigurableGroups::class)
并接受它生成的警告,或者在 Java 而不是 Kotlin 中定义注释。
在 Android studio 中使用 kapt/kotlinpoet 构建 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 标记,我都希望从反射中获取数据。
Kotlin 的 @Repeatable
注释似乎纯粹是工具提示,与 Java 的 @Repeatable
约定不匹配。
似乎java合约需要定义一个容器注解,以便将重复的注解打包为单个注解,供注解处理器检索。
您需要为容器注释显式添加 @java.lang.annotation.Repeatable(ConfigurableGroups::class)
并接受它生成的警告,或者在 Java 而不是 Kotlin 中定义注释。