【发布时间】:2019-04-06 20:57:20
【问题描述】:
今天我在 Kotlin 中玩了一些 java.lang.reflect.Proxy,我对这种行为感到惊讶:
import java.lang.reflect.Proxy
interface Dog {
fun bark()
fun bark3Times()
}
class DogImpl : Dog {
override fun bark() = println("Bark!")
override fun bark3Times() = repeat(3) { bark() }
}
fun Dog.bark5Times() = repeat(5) { bark() }
fun main(args: Array<String>) {
val classLoader = Dog::class.java.classLoader
val realDog: Dog = DogImpl()
val proxyDog: Dog = Proxy.newProxyInstance(
classLoader,
arrayOf(Dog::class.java)
) { _, method, _ ->
println("Proxy invoked! Method = ${method.name}")
method.invoke(realDog)
} as Dog
println("--- Dog barking 3 times ---")
proxyDog.bark3Times()
println()
println("--- Dog barking 5 times ---")
proxyDog.bark5Times()
}
输出:
--- Dog barking 3 times ---
Proxy invoked! Method = bark3Times
Bark!
Bark!
Bark!
--- Dog barking 5 times ---
Proxy invoked! Method = bark
Bark!
Proxy invoked! Method = bark
Bark!
Proxy invoked! Method = bark
Bark!
Proxy invoked! Method = bark
Bark!
Proxy invoked! Method = bark
Bark!
问题:
为什么在第一个示例中只为bark3Times 调用而不为单独的bark 调用调用代理,但在第二个示例中它不为bark5Times 调用,但这次为每个bark 调用调用?
【问题讨论】:
-
提示与问题无关,而不是
(0 until 5).forEach{ ... }您可以使用内置函数repeat:repeat(5){ ... }。 -
@Pawel 谢谢,我会将建议应用于问题以获取更多惯用代码。
标签: java kotlin reflection dynamic-proxy extension-function