美文网首页
静态代理和动态代理

静态代理和动态代理

作者: 朝生夕丧 | 来源:发表于2019-01-23 13:56 被阅读68次

静态代理

静态代理的实现比较简单,代理类通过实现与目标对象相同的接口,并在类中维护一个代理对象。通过构造器塞入目标对象,赋值给代理对象,进而执行代理对象实现的接口方法,并实现前拦截,后拦截等所需的业务功能

public class StaticProxy {
    private Person tagertObject = new Woman();

    /**
     * 对eat方法进行增强
     * @return
     */
    public String eat(){
        System.out.println(">>>>>>>before");
        tagertObject.eat("apple");
        System.out.println(">>>>>>>after");
        return "delicious";
    }
}

woman类请查阅关于oop和aop案例
测试代码

public static void test_static(){
        StaticProxy staticProxy = new StaticProxy();
        String eat = staticProxy.eat();
        System.out.println(eat);
    }

结果如下


静态代理对eat方法进行增强

动态代理

代理类在程序运行时创建的代理方式被成为动态代理, 然而静态代理的代理类在程序运行时已经编译完成, 这也是两者最大的区别. 动态代理有jdk代理和cglib代理, jdk代理案例在关于oop和aop中已经演示, 以下是cglib的代理方式
创建拦截器类, 实现MethodInterceptor, 哦, 忘了, 首先要加入cglib包

        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.5</version>
        </dependency>

cat类

public class Cat {
    public Cat(){
        System.out.println(">>>>>>>构造函数");
    }

    public void shout(){
        System.out.println(">>>>>>>>>>>喵喵喵 喵喵喵");
    }

    /**
     * 注意被final修饰的方法不能被动态代理
     */
    public final void jump(){
        System.out.println(">>>>>>>>>>>jump jump");
    }

}
public class TargetInterceptor implements MethodInterceptor {
    /**
     * 拦截方法
     * @param o
     * @param method
     * @param objects
     * @param methodProxy
     
* @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println(">>>>>>>>before");
        Object invoke = methodProxy.invokeSuper(o, objects);
        System.out.println(">>>>>>>>after");
        return invoke;
    }
}

测试代码

public static void test_dynamic_cglib(){
        // 设置debug生成的class存放位置
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY,"E:\\class");
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(Cat.class);
        enhancer.setCallback(new TargetInterceptor());
        Cat cat = (Cat) enhancer.create();
        cat.shout();
        cat.jump();
    }

测试结果

被final修饰的jump方法没有被代理

JDK动态代理和Gglib动态代理的区别

1.JDK动态代理是实现了被代理对象的接口,Cglib是继承了被代理对象
2.JDK和Cglib都是在运行期生成字节码,JDK是直接写Class字节码, Cglib使用ASM框架写Class字节码,Cglib代理实现更复杂,生成代理类比JDK效率低
3.JDK调用代理方法,是通过反射机制调用,Cglib是通过FastClass机制直接调用方法,Cglib执行效率更高
4.被代理类有接口用jdk代理, 无接口用cglib代理

相关文章

  • 编程常用的设计模式

    动态代理和静态代理 静态代理 动态代理 静态代理与动态代理的区别 JDK中的动态代理和CGLIB 实现动态代理的方...

  • 静态代理、动态代理

    代理分为静态代理和动态代理 按照代理创建的时期,可以分为静态代理和动态代理: (1) 静态代理:由程序员或者...

  • JAVA动态代理的实现方式

    1. 静态代理VS动态代理 代理类可以增强被代理对象的方法。可分为静态代理和动态代理。 1.1 静态代理 静态代理...

  • Spring之代理模式

    九、代理模式 目录:静态代理、动态代理AOP的底层机制就是动态代理。代理模式分为静态代理和动态代理。接触aop之前...

  • Java 代理的实现原理

    一、怎样使用代理 二、代理实现的原理 一、代理分为静态代理和动态代理 静态代理:代理对象获得目标对象的引用 动态代...

  • 带你初识Java的代理模式

    Spring AOP是基于动态代理设计模式实现的,相对的就有静态代理 动态代理和静态代理 静态代理 对于静态代理,...

  • 设计模式之代理模式

    代理分为静态代理和动态代理。 动态代理又包括基于JDK的动态代理、基于CGlib 的动态代理、基于Aspectj实...

  • Java高级主题(五)——动态代理

    代理可以分为静态代理、动态代理,动态代理又可以分为 jvm的动态代理 和 cglib的动态代理。像spring框架...

  • java静态代理与动态代理简单分析

    原链接地址 1、动态代理(Dynamic Proxy) 代理分为静态代理和动态代理,静态代理是在编译时就将接口、实...

  • 动态代理和静态代理

    一、什么是静态代理和动态代理 静态代理:手动的创建代理类在程序运行前代理类就已经存在了。 动态代理...

网友评论

      本文标题:静态代理和动态代理

      本文链接:https://www.haomeiwen.com/subject/lbjjjqtx.html