Если я на 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
. Я ищу что-то вроде Proxy
в JDK, которое я могу использовать для проксирования любого интерфейса. Извините за путаницу.