码迷,mamicode.com
首页 > 其他好文 > 详细

动态代理

时间:2018-09-10 00:56:49      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:返回   ...   log   name   图片   处理   规范   size   you   

概述 : Spring 框架有一个技术, 叫做 AOP 技术. (面向切面编程)

效果 : 拦截被调用对象的所有方法.
技术分享图片

技术分享图片

技术分享图片

实现类完成
接口定义 :

public interface SuperStar {

    void sing(int money);
    void liveShow(int money);
    void sleep();
}

实现类定义 :

public class LiuYan implements SuperStar {

    @Override
    public void sing(int money) {
        System.out.println("柳岩为了唱了一首 <真的真的很爱你!> 歌曲. 挣了 = " + money);
    }

    @Override
    public void liveShow(int money) {
        System.out.println("柳岩参加了 <屌丝男士!> 节目. 挣了 = " + money);
    }

    @Override
    public void sleep() {
        System.out.println("柳岩真的很累了, 休息休息...");
    }
}

测试类定义 :

@Test
public void test1() {

    SuperStar star = new LiuYan();

    star.sing(-10);
    star.liveShow(-20);
    star.sleep();
}

@Test
public void test2() {

SuperStar star = new LiuYan();

/************ 动态代理对象 start **************/
// 1. 使用 Proxy 类调用 newProxyInstance 方法
// 1.1 类加载器 (与被代理对象保持一致)
ClassLoader loader = star.getClass().getClassLoader();
// 1.2 interfaces 接口行为规范 (与被代理对象保持一致)
Class<?>[] interfaces = star.getClass().getInterfaces();
// 1.3 InvocationHandler 调用处理器 (实现类)
// 注意点 : 返回的 Object 类型对象必须要转成接口实现.
SuperStar proxy = (SuperStar) Proxy.newProxyInstance(loader, interfaces, new MyInvocationHandler(star));
/************ 动态代理对象 end **************/
// System.out.println(proxy.getClass());
proxy.sing(10000);
proxy.liveShow(200000);
proxy.sleep();

}

MyInvocationHandler 实现类代码编写 :
简化版本 :

public class MyInvocationHandler implements InvocationHandler {
    // 属性
    private SuperStar star;

    // 构造方法
    public MyInvocationHandler(SuperStar star) {
        this.star = star;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable  {
        // 直接放行 
        return method.invoke(star, args);   
    }
}

判断版本 :

public class MyInvocationHandler implements InvocationHandler {
    // 属性
    private SuperStar star;

    // 构造方法
    public MyInvocationHandler(SuperStar star) {
        this.star = star;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable  {

        // 1. 判断方法
        if (method.getName().equals("sing")) {
            // 2. 取出参数
            int money = (int) args[0];
            // 3. 判断参数
            if (money < 10000) {
                System.out.println("滚, 你这个穷屌丝, 赶紧回家撸代码去...");
                return null;
            }
            // 4. 参数合法
            // 抽提成
            System.out.println("代理抽取了 " + (money * 0.3) + " 回扣.");
            // 5. 调用真实的方法
            return method.invoke(star, (int)(money * 0.7));
        } else if ("liveShow".equals(method.getName())) {
            // 2. 取出参数
            int money = (int) args[0];
            // 3. 判断参数
            if (money < 100000) {
                System.out.println("滚, How old are you. 继续回家撸代码去...");
                return null;
            }
            // 4. 参数合法
            // 抽提成
            System.out.println("代理抽取了 " + (money * 0.3) + " 回扣.");
            // 5. 调用真实的方法
            return method.invoke(star, (int)(money * 0.7));
        }

        return method.invoke(star, args);   // 其它方法直接放行   (close  池)
    }
}

动态代理

标签:返回   ...   log   name   图片   处理   规范   size   you   

原文地址:http://blog.51cto.com/13962277/2172978

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!