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

静态代理和动态代理

时间:2019-09-08 18:30:47      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:his   cto   owa   obj   div   cer   抽象类   使用   否则   

根据我自己的的理解:

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

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

}

 

 

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

静态代理和动态代理

标签:his   cto   owa   obj   div   cer   抽象类   使用   否则   

原文地址:https://www.cnblogs.com/westlife-11358/p/11487455.html

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