代理模式分类
1.静态代理模式
2.动态代理模式
静态代理模式
1.委托对象与代理对象需要实现相同的接口
2.代理对象的构造方法中传人委托对象实例
动态代理模式(通过反射机制动态生成代理者的对象)
一、动态代理类
import java.lang.reflect.InvocationHandler
import java.lang.reflect.Method
class DynamicProxy(val any: Any) : InvocationHandler {
override fun invoke(proxy: Any?, method: Method?, args: Array<out Any>?): Any? {
return if (method?.name.equals("work")) {
method?.invoke(any, *(args ?: arrayOfNulls(0)))
proxy
} else {
method?.invoke(any, *(args ?: arrayOfNulls(0)))
}
}
}
二、实现动态代理类遇到的两个问题
1.报错java.lang.IllegalArgumentException: wrong number of arguments
原因:数组类参数无法兼容可变参数,需要使用使用伸展操作符(*)进行转换
可变参数和数组类参数:
a.可变参数是兼容数组类参数的,但是数组类参数却无法兼容可变参数。
b.可变参数类型必须作为参数列表的最后一项,而不能放在定长参数的前面。
2.java.lang.IllegalArgumentException非法参数异常
解决办法:需要判断method的name是否是“work”,再确定返回什么
三、通过反射获取代理类
val xiaoMing: ILawsuit = XiaoMing()
val proxy: InvocationHandler=
DynamicProxy(xiaoMing)
val layer=Proxy.newProxyInstance(xiaoMing.javaClass.classLoader,xiaoMing.javaClass.interfaces,proxy) as ILawsuit
layer.submit()