代理模式
参考:设计模式-代理模式思考
简单例子
package mode.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author gang.tu
*/
public class ProxyHandler implements InvocationHandler {
Object object;
ProxyHandler(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("我是代驾!");
Object result = method.invoke(object, args);
return result;
}
public Object getProxyObject() {
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
}
}
单元测试
@Test
public void proxy() {
Car dd = new Dd();
ProxyHandler proxyHandler = new ProxyHandler(dd);
Car proxy = (Car) proxyHandler.getProxyObject();
proxy.drive();
}
运行结果:
我是代驾!
我自己开车
总结
- 非动态需要一对一配置代理对象。
- 使用JDK动态代理:必须实现接口,因为内部实现需要继承proxy类。
- 如果没有实现接口,请是使用CGLIB。
- 典型:AOP
本文深入探讨了设计模式中的动态代理模式,通过一个简单的代码示例展示了如何使用Java反射API实现动态代理,包括创建InvocationHandler实例和获取代理对象的过程。文章还提供了单元测试代码,并总结了动态代理与非动态代理的区别,以及JDK动态代理和CGLIB的适用场景。
2482

被折叠的 条评论
为什么被折叠?



