静态代理和动态代理

Posted westlife-11358

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态代理和动态代理相关的知识,希望对你有一定的参考价值。

根据我自己的的理解:

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

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

 

 

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

以上是关于静态代理和动态代理的主要内容,如果未能解决你的问题,请参考以下文章

Java动态代理与静态代理的定义与区别??

静态代理和动态代理原理及实现

浅谈静态代理和动态代理

解决全站字符编码问题--动态代理和静态代理

静态代理和动态代理

什么是反射技术?什么是静态代理?什么是动态代理?什么是aop