zoukankan      html  css  js  c++  java
  • 静态代理和动态代理

    根据我自己的的理解:

    静态代理是实现抽象接口,在代理汇中获取代理对象的对象。需要一一去重写抽象类中的方法。

    动态代理使用的是反射,需要我们传入被代理类,并默认实现所有的目标方法,通过invoke中方法反射获取menthod对象方法名称即可实现。

    public class HuangNiuHandle implements InvocationHandler【1】 {

        private Object proxyTarget;

        public Object getProxyInstance(Object target) {
            this.proxyTarget = target;
            return Proxy.newProxyInstance【2】(proxyTarget.getClass().getClassLoader()【获取代理类实例对象】, proxyTarget.getClass().getInterfaces(), this);
        }

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

            Object methodObject = null;

            System.out.println("line up");
            methodObject = method.invoke(proxyTarget, args);
            System.out.println("go home and sleep");

            return methodObject;
        }

    }

    当 我们需要动态代理执行的仅是部分方法,那么只需要进行方法名称判断即可。

    public class HuangNiuHandle implements InvocationHandler {
    
        private Object proxyTarget;
    
        public Object getProxyInstance(Object target) {
            this.proxyTarget = target;
            return Proxy.newProxyInstance(proxyTarget.getClass().getClassLoader(), proxyTarget.getClass().getInterfaces(), this);
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
            Object methodObject = null;
    
            if ("lookConcert".equals(method.getName()) ||
            "seeADoctor".equals(method.getName())) {
    
                System.out.println("line up");
                // 调用目标方法
                methodObject = method.invoke(proxyTarget, args);
            } else {
                // 不使用第一个proxy参数作为参数,否则会造成死循环
                methodObject = method.invoke(proxyTarget, args);
            }
    
            return methodObject;
        }
    
    }

    参考微信公众号:一个优秀的废人一篇文章写的,不能说懂了,但是获得了点东西,感谢!

  • 相关阅读:
    30天敏捷结果(17):找出高效时间,并利用它来处理重要事情
    需求:需求获取技术之 观察
    30天敏捷结果(13):如何对事情付诸行动
    2010年11月blog汇总:敏捷练习、需求和建模
    MDSF:Eclipse MDD Day学习
    需求:结合TOGAF做好需求获取工作
    MDSF:架构工具简要功能说明
    信息系统开发平台OpenExpressApp:【OpenTest】 之 框架实现说明
    吃:第二次去吃香草香草
    30天敏捷生活(911):调整30天的节奏
  • 原文地址:https://www.cnblogs.com/westlife-11358/p/11487455.html
Copyright © 2011-2022 走看看