使用注释处理在命令中包装方法

时间:2018-10-03 17:39:13

标签: java android reflection kotlin annotations

在方法调用之前和之后,我有一堆任务需要执行。

我的方法是使用批注处理和自定义批注来实现。

@BeforeSomething(task = 'something')
@AfterSomething(task = 'something else')
fun something(blah: Something) {
  Log.d("Something", "Something $blah")
}

这样,从仅运行此方法的最终输出可能像:

Before task, options 'something'
Something blahblahblah
After task, options 'somethign else'

什么是最好的方法?我已经研究过AspectJ,但是那与Kotlin无关。我也研究了Lombok,但无法使用该库。

1 个答案:

答案 0 :(得分:0)

您可以通过高阶函数-包装函数来提供任务:

inline fun <T> wrapFunction(before: Task? = null, after: Task? = null, body: () -> T): T =
    try {
        before?.run()
        body()
    } finally {
        after?.run()
    }

fun something(blah: String)  = wrapFunction(before = BeforeTask, after = AfterTask)  {
    println("Something")
}

这不需要额外的工具,并且可以安全重构。 如果您不提供beforeafter参数,由于消除了无效代码(无成本的抽象方法),Kotlin编译器甚至不会生成null检查。