实现思路
- 定义一个接口,目标类需要实现该接口,这样代理对象才能与目标对象具有相同的方法签名。
- 创建一个InvocationHandler接口的实现类,在这个类中处理目标方法的调用,并在调用前后打印日志。
- 使用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()
}