我正在尝试构建我的第一个注释处理器,并且进展顺利。我正在创建一个代码生成处理器,该处理器基本上为定义的接口生成SharedPreferences
。我当前的注释是SharedPrefs
和Default
。 @SharedPrefs
通知处理器该文件是接口,需要生成的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]")
原样,内部forEach
从带有@Default
注释的all文件中返回all属性。代码生成工作正常,但是这似乎不是最好的方法。有没有办法只获取我正在处理的当前@SharedPrefs
类中的属性?例如,类似:
roundEnv.getElementsAnnotatedWith(SharedPrefs::class.java)?.forEach { element ->
...
element.methodToGetAnnotatedProperties(Default::class.java)?.forEach {
...
}
}
此外,任何人都知道的有关注释处理的任何其他资源都将成为注释中的重要补充。谢谢!
有人问了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
}