【发布时间】:2019-06-17 00:53:57
【问题描述】:
如果我在 JVM 上,我可以这样做:
object Playground {
class DynamicInvocationHandler : InvocationHandler {
@Throws(Throwable::class)
override operator fun invoke(proxy: Any, method: Method, args: Array<Any>): Any {
LOGGER.info("Invoked method: {}", method.name)
return 42
}
companion object {
private val LOGGER = LoggerFactory.getLogger(
DynamicInvocationHandler::class.java)
}
}
@JvmStatic
fun main(args: Array<String>) {
val proxy = Proxy.newProxyInstance(
Playground::class.java.classLoader,
arrayOf<Class<*>>(MutableMap::class.java),
DynamicInvocationHandler()) as MutableMap<String, String>
proxy["foo"] = "bar"
}
}
运行它将打印Invoked method: put。如何在 Kotlin common 项目中做这样的事情?
编辑:我不想在我的公共模块中使用 Java 中的任何东西。我知道常见的项目是如何运作的。相反,我感兴趣的是是否有基于 Kotlin 的解决方案。
编辑 2: 我不想代理 Map 类。我正在 JDK 中寻找类似 @987654325@ 的东西,我可以用它来代理 任何接口。很抱歉造成混乱。
【问题讨论】:
-
您无法在公共模块中使用 Java 反射。因为这是一个 Java 特性,并且只在 Java 模块中可用。
-
我编辑了我的答案。我知道这是一个 Java 特性,我明白什么是通用项目。我找不到基于 Kotlin 的解决方案,但这就是我要问的原因。
标签: kotlin proxy-pattern kotlin-multiplatform