• 静态代理和动态代理


    根据我自己的的理解:

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

    动态代理使用的是反射,需要我们传入被代理类,并默认实现所有的目标方法,通过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;
        }
    
    }

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

  • 相关阅读:
    How to setup SLF4J and LOGBack in a web app
    Java Web services: WS-Security with Metro--referenc
    SOAP 及其安全控制--转载
    SQL 四种连接:内连接、左外连接、右外连接、全连接--转载
    Redis的安装、配置 --转载
    mysql中不同事务隔离级别下数据的显示效果--转载
    How to Map Distinct Value Types Using Java Generics--reference
    Spring(AbstractRoutingDataSource)实现动态数据源切换--转载
    springMVC项目在jboss7中配置应用自己的log4j--转载
    2017各银行贷款利息表及P2P平台贷款利率比较
  • 原文地址:https://www.cnblogs.com/westlife-11358/p/11487455.html
Copyright © 2020-2023  润新知