扫码关注官方订阅号
我知道如何使用动态代理实现一级代理,却不知道如何实现多级代理,还是根本就不能实现多级代理。就是类似于new CarLogProxy(new CarTimeProxy(new Car())).move();这样的多级代理。
new CarLogProxy(new CarTimeProxy(new Car())).move();
正好在学习动态代理的过程中也碰到了这个疑问,没查到答案,就自己摸索着写出来了,能实现,但是不是科学的方法还不知道,望大牛出现指导。具体的方法或Handler就不晒出来了,主要是调用的方式。因为ChargeProxyHandler和LogProxyHandler都是代理类,除了实现各自的业务,其它方法都一样。
ChargeProxyHandler
LogProxyHandler
public class Test { public static void main(String[] args) { //实例化被代理类 RailwayStation rs = new RailwayStation(); Class<?> c = rs.getClass(); //实现了InvocationHandler的收费事务处理器,增加收费处理 InvocationHandler handler = new ChargeProxyHandler(rs); //通过Proxy生成代理类 TicketBusiness t = (TicketBusiness) Proxy.newProxyInstance(c.getClassLoader(), c.getInterfaces(), handler); //实现了InvocationHandler的日志事务处理器,增加日志处理,将上面动态生成的代理传入Handler InvocationHandler logHandler = new LogProxyHandler(t); TicketBusiness t2 = (TicketBusiness) Proxy.newProxyInstance(c.getClassLoader(), c.getInterfaces(), logHandler); t2.saleTicket(); } }
运行结果:
日志 ==> 开始卖票 一本正经的卖票,价格:31元 收取了手续费5元! 日志 ==> 结束卖票
public static <T> T getMultiLevelProxy(final T obj,InvocationHandler... handlers){ ClassLoader loader = obj.getClass().getClassLoader(); Class[] interfaces = obj.getClass().getInterfaces(); T t = obj; for(InvocationHandler handler : handlers){ t = (T) Proxy.newProxyInstance(loader,interfaces,handler); } return t; }
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
正好在学习动态代理的过程中也碰到了这个疑问,没查到答案,就自己摸索着写出来了,能实现,但是不是科学的方法还不知道,望大牛出现指导。
具体的方法或Handler就不晒出来了,主要是调用的方式。因为
ChargeProxyHandler和LogProxyHandler都是代理类,除了实现各自的业务,其它方法都一样。运行结果: