明天你会感谢今天奋力拼搏的你。
ヾ(o◕∀◕)ノヾ

public class OrderServiceProxy extends OrderServiceImpl {
public void order() {
System.out.println(">>>打印订单日志开始");
super.order();// 执行父类的order 方法OrderServiceImpl
System.out.println(">>>打印订单日志结束");
}
}
可以直接通过如下方式调用:
OrderService orderService = new OrderServiceProxy();
orderService.order();
实现接口的方式:
public class OrderServiceProxy implements OrderService {
/**
* 被代理对象
*/
private OrderService orderService;
public void order() {
System.out.println(">>>打印订单日志开始");
orderService.order();
System.out.println(">>>打印订单日志结束");
}
public OrderServiceProxy(OrderService orderService) {
this.orderService = orderService;
}
}
可以直接通过如下方式调用:
OrderService orderService = new OrderServiceProxy(new OrderServiceImpl());
orderService.order();
public class JdkInvocationHandler implements InvocationHandler {
/**
* 被代理类对象 目标代理对象
*/
private Object target;
public JdkInvocationHandler(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(">>>jdk打印日志开始:proxy:"+proxy.getClass().toString());
Object reuslt = method.invoke(target, args);// java的反射机制执行方法 执行目标对象的方法
System.out.println(">>>jdk打印日志结束");
return reuslt;
}
/**
* 使用jdk动态代理创建代理类
* @param <T>
* @return
*/
public <T> T getProxy() {
return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
}
使用jdk动态代理调用的方式:
//将JDK动态代理生成的class文件保存到本地
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
//使用jdk动态代理
OrderService proxy = new JdkInvocationHandler(new OrderServiceImpl()).getProxy();
proxy.order();
(此处顺便外链下JDK动态代理生成class文件失败的问题:https://blog.csdn.net/zyq8514700/article/details/99892329)
调用JDK动态代理的时候,不能赋值给实现类,如下图,只能通过父类接收。所以说jdk动态代理要实现接口才可以。

这是为何?可以反编译看一下自动生成的代理类,因为其集成的Proxy类,实现的OrderService接口,因此只能通过父类接收。

CGLIB实现动态代理
CGLIB通过ASM字节码处理框架实现的动态代理
Jdk动态代理要实现接口才可以,CGLIB里被代理类就不需要实现接口,因为是通过的继承。
首先继承MethodInterceptor:
public class CglibMethodInterceptor implements MethodInterceptor {
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println(">>>>cglib日志收集开始....");
Object reuslt = proxy.invokeSuper(obj, args);
System.out.println(">>>>cglib日志收集结束....");
return reuslt;
}
}
使用动态代理:
//将动态代理生成的class文件保存到本地
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\code");
// 使用cglib动态代理
CglibMethodInterceptor cglibMethodInterceptor = new CglibMethodInterceptor();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(OrderServiceImpl.class);
enhancer.setCallback(cglibMethodInterceptor);
OrderServiceImpl orderServiceImpl = (OrderServiceImpl) enhancer.create();
orderServiceImpl.order();
用此方式OrderServiceImpl无需实现OrderService接口。
参考文献:
https://www.runoob.com/design-pattern/strategy-pattern.html
http://www.mayikt.com/front/couinfo/194/0#
全部评论