MST

星途 面试题库

面试题:Kotlin反射实现动态代理的应用

利用Kotlin反射机制实现一个简单的动态代理,代理对象能够在调用目标方法前后打印日志。请详细说明实现思路并给出完整代码。
35.9万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 定义一个接口,目标类需要实现该接口,这样代理对象才能与目标对象具有相同的方法签名。
  2. 创建一个InvocationHandler接口的实现类,在这个类中处理目标方法的调用,并在调用前后打印日志。
  3. 使用Kotlin的反射机制,通过Proxy类的newProxyInstance方法创建代理对象。

完整代码

import java.lang.reflect.InvocationHandler
import java.lang.reflect.Method
import java.lang.reflect.Proxy

// 定义接口
interface TargetInterface {
    fun targetMethod()
}

// 目标类实现接口
class TargetClass : TargetInterface {
    override fun targetMethod() {
        println("目标方法执行中")
    }
}

// InvocationHandler实现类
class MyInvocationHandler(private val target: TargetInterface) : InvocationHandler {
    override fun invoke(proxy: Any, method: Method, args: Array<out Any>?): Any? {
        println("目标方法调用前")
        val result = method.invoke(target, *args.orEmpty())
        println("目标方法调用后")
        return result
    }
}

// 创建代理对象的方法
fun createProxy(target: TargetInterface): TargetInterface {
    return Proxy.newProxyInstance(
        target.javaClass.classLoader,
        target.javaClass.interfaces,
        MyInvocationHandler(target)
    ) as TargetInterface
}

fun main() {
    val target = TargetClass()
    val proxy = createProxy(target)
    proxy.targetMethod()
}