什么是动态代理?动态代理是相对于静态代理而言的,是指在程序运行期间,动态的创建出一个虚拟的代理对象。相较于静态代理,动态代理,只需要接口和目标类,不再需要一个真实的代理类了。
基本语法
import java.lang.reflect.Proxy;
Proxy.newProxyInstance(){
loader, //类加载器(目标类的类加载器)
interfaces, //接口数组(目标类和虚拟代理类的共同接口的字节码对象)
h // 句柄接口(虚拟代理处理问题的具体实现)
}具体实现,
假设已经有了一个目标类Target,一个目标类的接口TargetInterface,一个方法show,一个带参方法say(int x)
TargetInterface targetPorxy = Porxy.newProxyInstace(){
Target.class.getClassloader(),
new class[]{TargetInterface.class},
new InvocationHandler(){
public Object invoke(Object proxy, Method method, object[] args){
//代理在目标对象之前搞手段……
Object invoke = method.invoke(new Target(),args);//通过反射执行目标对象
//代理在目标对象之后偷偷搞事情……
return null;
}
}
}
// 代理对象执行方法
targetPorxy.show()
targetPorxy.say(100)InvocationHandler接口突然把人整的有点蒙了,特别介绍一下
new InvocationHandler(){
/*
* 重点理解和记忆invoke()的两个参数,Method method 和 object[] args
* Method method 是 目标对象的字节码对象
* object[] args 是 目标对象方法的参数
*/
public Object invoke(Object proxy, Method method, object[] args){ }
}接着又牵扯出另一个问题,如何参数传递给目标对象,这是通过代理对象调用方法实现的,如:targetProxy.say(100)
注意的地方
这种JDK实现的动态代理,要求目标对象必须有接口,没有接口这件事情就做不了
看来想把这个动态代理说清楚,还是一件挺麻烦的事情,需要多写才行,以后需要时不时的来看看想想,做到烂熟于心