首页 > 其他 > 详细

动态代理

时间:2019-08-01 21:33:32      阅读:121      评论:0      收藏:0      [点我收藏+]

1.1 简述及实现原则:

  在不改变源代码的前提下,在源代码的执行中,动态的将原方法进行增强

依赖反射

动态代理中:

   待增强的方法称为被代理的对象

   增强功能的对象叫做代理对象

举例:

  买衣服

  以前买衣服必须去服装店购买。

  现在通过网店对服装店进行了增强,可以不出门就买上衣服

  服装店就是被代理的对象

  网店就是代理对象

 代理:代为处理

实现原则:

  1、获取代理对象

  2、通过Proxy.newInstance方法创建代理对象

  3、代理对象获取被代理对象所有的接口,用于代理

  4、实现InvocationHandler接口,进行功能增强

1.2 案例实现:

代码解释写在了Test类中

Phone接口:

public interface Phone {
    void conversation(String number);
    void call();
}

HWPhone实现类:

public class HWPhone implements Phone {
    public void conversation(String number) {
        System.out.println("电话号:"+number);
    }
    public void call() {
        System.out.println("打电话");
    }
}

Test类:

public class Test {
    public static void main(String[] args) {
        //需求:只对call方法进行增强
        //1. 获取被代理对象
        final HWPhone hwPhone = new HWPhone();
        //2. 根据被代理对象,创建代理对象
        //参数一:获取当前类的类加载器
        //参数二:获取被代理对象的所有接口
        //参数三:实现InvocationHandler接口,对功能进行增强
        Proxy.newProxyInstance(
                Test.class.getClassLoader(),
                hwPhone.getClass().getInterfaces(),
                new InvocationHandler() {
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //2.1 判断是否需要增强 call
                        if (method.getName().equals("call")) {
                            //2.1.1 调用之前方法功能
                            //参数一:被代理对象,必须为final类型
                            //参数二:该方法的参数,无参数args为null
                            method.invoke(hwPhone, args);
                            //2.1.2 对该功能进行增强
                            System.out.println("我是" + method.getName() + "方法,我被增强了~~~");
                            //该方法无返回值,返回null即可
                            return null;
                        }
                        //2.2 不是需要增强的方法,调用之前的即可
                        return method.invoke(hwPhone, args);
                    }
                });
        //必须使用代理对象调用方法才会被增强
        hwPhone.call();
        hwPhone.conversation("54188741741");
    }
}

 

未增强展示信息:

 技术分享图片

 

增强后展示信息:

技术分享图片

 

使用场景:

小结:

  1、获取代理对象

  2、根据代理对象,创建被代理对象

  3、代理对象调用增强方法

注意:每次调用方法都是调用的invoke方法。

 

作者:xihe
地址:https://www.cnblogs.com/xihelog/

动态代理

原文:https://www.cnblogs.com/xihelog/p/11285442.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!