目录
动态代理
动态代理和静态代理角色一样,动态代理的代理类是动态生成的,不是直接写好的,动态代理分为两大类: 1、基于接口的动态代理:JDK动态代理,2、基于类的动态代理:cglib。首先需要了解Proxy和InvocationHandler接口。
动态代理实现
第一步:创建一个被代理的接口
//被代理的接口
public interface ValetDriving {
public void valetDriving();
}
第二步:实现被代理接口中的方法
//被代理接口实现
public class Driver implements ValetDriving{
@Override
public void valetDriving() {
System.out.printf("needValetDriving!");
}
}
第三步:编写自动生成代理类
/**
* 1、Proxy:代理
* Proxy提供了创建动态代理类和实例的静态方法了它也是由这些方法创建的所有动态代理类的超类。
* Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),new Class<?>[] { Foo.class },handler);
*
* 2、InvocationHandler接口:调用处理程序
* InvocationHandler是由代理实例的调用处理实现的接口,每个代理实例都有一个关联的调用处理程序。 当在代理实例上调用方法时,方法调用将被编码并分派到其询用处理程序的invoke方法。
* invoke:处理代理实例上的方法调用并返回结果。
*/
//自动生成代理类
public class ProxyInvogationHandler implements InvocationHandler {
//被代理的接口
private ValetDriving valetDriving;
public void setValetDriving(ValetDriving valetDriving) {
this.valetDriving = valetDriving;
}
//处理代理实例并返回结果
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//动态代理的本质,就是使用反射机制实现!
Object invoke = method.invoke(valetDriving, args);
return invoke;
}
//生成代理类
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(), valetDriving.getClass().getInterfaces(), this);
}
}
测试:
//测试动态代理 public class TestProxy { public static void main(String[] args) { //真实角色 Driver driver = new Driver(); //代理角色 ProxyInvogationHandler proxyInvogationHandler = new ProxyInvogationHandler(); //通过调用程序处理角色来处理我们些调用的接门对象 proxyInvogationHandler.setValetDriving(driver); ValetDriving proxy = (ValetDriving)proxyInvogationHandler.getProxy(); proxy.valetDriving(); } }
结果:needvaletDriving!