Java 使用JDK的动态代理如何实现多级代理
巴扎黑
巴扎黑 2017-04-17 17:24:11
[Java讨论组]

我知道如何使用动态代理实现一级代理,却不知道如何实现多级代理,还是根本就不能实现多级代理。就是类似于new CarLogProxy(new CarTimeProxy(new Car())).move();这样的多级代理。

巴扎黑
巴扎黑

全部回复(2)
怪我咯

正好在学习动态代理的过程中也碰到了这个疑问,没查到答案,就自己摸索着写出来了,能实现,但是不是科学的方法还不知道,望大牛出现指导。
具体的方法或Handler就不晒出来了,主要是调用的方式。因为ChargeProxyHandlerLogProxyHandler都是代理类,除了实现各自的业务,其它方法都一样。

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中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号