gpt4 book ai didi

android - Kotlin 注释 : Get interface inner annotated properties

转载 作者:行者123 更新时间:2023-12-02 13:44:02 25 4
gpt4 key购买 nike

概述

我正在尝试构建我的第一个注释处理器,并且进展顺利。我正在创建一个代码生成处理器,它基本上生成 SharedPreferences对于定义的接口(interface)。我当前的注释是 SharedPrefsDefault . @SharedPrefs通知处理器该文件是一个接口(interface)并且需要一个生成的 prefs 文件。 @Default就是我在界面中注释了一些属性,以便让处理器知道将默认值设置为什么。可以有多个文件定义为 @SharedPrefs .

执行

我目前使用以下代码来获取带有 @SharedPrefs 注释的文件列表和 @Default年代:

roundEnv.getElementsAnnotatedWith(SharedPrefs::class.java)?.forEach { element ->
...
roundEnv.getElementsAnnotatedWith(Default::class.java)?.forEach {
...
}
}
@SharedPrefs :

@Retention(AnnotationRetention.SOURCE)
@Target(AnnotationTarget.CLASS)
annotation class SharedPrefs(val showTraces: Boolean = false)
@Default :

@Retention(AnnotationRetention.SOURCE)
@Target(AnnotationTarget.PROPERTY)
annotation class Default(val defaultValue: String = "[null]")

正在使用:

@SharedPrefs
interface InstanceSettings {
var wifiPassword: String
@Default("20")
var count: Int
}

问题

照原样,内部 forEach正在返回带有 @Default 注释的所有文件的所有属性.代码生成工作正常,但这似乎不是最好的方法。有没有办法只获取当前 @SharedPrefs 中的属性?我正在处理的类(class)?例如,类似:

roundEnv.getElementsAnnotatedWith(SharedPrefs::class.java)?.forEach { element ->
...
element.methodToGetAnnotatedProperties(Default::class.java)?.forEach {
...
}
}

* 编辑 *

我发现,对于我注释的方法

@SomeAnnotation
fun someMethod()

我可以遍历 element.enclosingElements并使用 enclosingElement.getAnnotation(<SomeAnnotation::class.java>) 查找它是否有注释.不幸的是,如果我在这里错了,请纠正我,我无法使用带有 AnnotationTarget.FIELD 的注释来注释接口(interface)变量因为它们没有支持字段,因为它是一个接口(interface)并且它们没有实现。因此,我使用 AnnotationTarget.PROPERTY .当遍历封闭元素时,所有变量都显示为 getter 和 setter。对于上面 InstanceSettings 的示例, 我得到 getWifiPassword , setWifiPassword , getCountsetCount .我没有得到 wifiPassword 的元素或 count .调用 getAnnotation(Default::class.java)将始终在这些上返回 null,因为它们是生成的。

此外,任何人都知道的关于注释处理的任何其他资源将是评论中的一个很好的补充。谢谢!

最佳答案

在 java 中提出了类似的问题 here

这是您如何创建一个可以为您完成工作的扩展功能!

roundEnv.getElementsAnnotatedWith(SharedPrefs::class.java)?.forEach { element ->
...
roundEnv.findNestedElements(SharedPrefs::class, Default::class)?.forEach {
...
}
}

fun <T> RoundEnvironment.findNestedElements(parent: KClass<*>, child: KClass<T>): List<Element>? {
val childs = this.getElementsAnnotatedWith(child.java)
val list = ArrayList<Element>()
for (element in childs)
{
if (element.getEnclosingElement().getAnnotation(parent.java) != null)
{
list.add(element)
}
}
return if(list.isEmpty()) null else list
}

关于android - Kotlin 注释 : Get interface inner annotated properties,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60743095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com