@Run
class SwordTest() {
@TestCase(id = “a”)
fun testCase(testId: String) {
println(“Run SwordTest Id = $testId”)
}
}
我们需要在 @TestCase注解作用在函数上的处理过程
::class
引用
首先声明一个变量指向SwordTest实例
然后就可以通过这个变量来获取该对象的类的信息,使用 ::class
来获取 sword对象实例的 KClass类的引用
val sword = SwordTest()
val kClass = sword::class
//有点像Java中的 getClass()
//上面这行代码,Kotlin编译器会自动推断出 kClass变量的类型是
val kClass:KClass = sword::class
- members扩展属性
下面我们需要获取 sword对象类型所声明的所有函数。Kotlin中 可以直接使用扩展属性 declaredFunctions来获取这个类中声明的所有函数。
//返回的是一个 Collection<KCallable<>> 其中是Koltlin泛型中的星投影
val members = kClass.members
- annotations属性
KFunction 类型继承了 KCallable,KCallable又继承了 KAnnotatedElement。KAnnotatedElement中有个public val annotations:List
属性里存储了该函数所有的注解信息。通过遍历这个存储Annotation的List,可以获取到TestCase注解:
for (f in members ) {
f.annotations.forEach {
if(it is TestCase){
val id = it.id //TestCase 注解的属性ID
doSomething(id) //注解处理逻辑
}
}
}
- call函数
另外,如果想通过反射来调用函数,可以直接使用 call():
f.call(sword, id)
//等价于
f.javaMethod?.invoke(sword, id)
//到这里,我们就完成了一个简单的注解处理器,完整的代码如下:
@Target(
AnnotationTarget.CLASS,
AnnotationTarget.FU