动态代理和静态代理简单理解

推荐 生活 2019-04-22 00:03:27 440

本文收集整理关于动态代理和静态代理简单理解的相关议题,使用内容导航快速到达。

内容导航:

  • Q1:什么是java代理模式,具体相关的动态代理和静态代理分别是什么?举例更好啦~
  • Q2:静态代理,JDK动态代理和CGLib动态代理之前的区别
  • Q3:动态代理和静态代理的区别
  • Q4:Spring事务管理是动态代理还是静态代理? CGLB支持动态代理吗?因为我听老师说CGLB是静态代理
  • Q1:什么是java代理模式,具体相关的动态代理和静态代理分别是什么?举例更好啦~

    class a
    {
    void a1(){System.out.print("a");}
    } class b
    {
    b()
    {
    a aa =new a();
    }
    void b1()
    {
    aa.a1();
    }
    }
    上边里例子就是一个简单的代理模式 在b中建立一个a的对象 然后b的b1方法里调研a的a1方法
    你只要实例化话一个b的对象的话 调用这个对象的b1方法就和调研a对象的a1方法的效果是完全一样的
    动态代理的话就是在
    b()
    {
    a aa =new a();
    }
    这个构造参数传进一个参数 根据这个参数来产生不同的对象(这里一般要用到工厂模式)
    根据产生对象的不同调研的方法肯定也就不一样了

    Q2:静态代理,JDK动态代理和CGLib动态代理之前的区别

    1、静态代理:静态代理中的代理类,需要我们自己写
    JDK动态代理类实现了InvocationHandler接口。在重写的invoke方法中可以看出,JDK动态代理的基础是反射(method.invoke(对象,参数)),还好反射看的比较多,到现在还记得。在这里需要提到的是Proxy.newProxyInstance(),这个方法。字面上的意思是 新建一个代理类的实例,这一点就和静态代理不同了。里面的参数有三个 类加载器、所有的接口,得到InvocationHandler接口的子类实例。这就是JDK动态代理,该代理有以下几种特点:
    1、Interface:对于JDK Proxy,业务类是需要一个Interface的,这是一个缺陷;
    2、Proxy:Proxy类是动态产生的,这个类在调用Proxy.newProxyInstance()方法之后,产生一个Proxy类的实力。实际上,这个Proxy类也是存在的,不仅仅是类的实例,这个Proxy类可以保存在硬盘上;
    3、Method:对于业务委托类的每个方法,现在Proxy类里面都不用静态显示出来
    4、InvocationHandler:这个类在业务委托类执行时,会先调用invoke方法。invoke方法在执行想要的代理操作,可以实现对业务方法的再包装。
    以上就是JDK动态代理
    3、CGLib动态代理:上面的JDK Proxy只能代理实现了接口的类,而不能实现接口的类就不能实现JDK代理。这时候就需要CGLib动态代理类
    这里需要注意的是实现MethodIntercetor接口,必须导入cglib-nodep-2.1_3.jar这个包。CGLib是针对类来实现代理的,他的原理是对指定的目标生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

    Q3:动态代理和静态代理的区别

    JAVA的静态代理与动态代理比较
    1.静态代理类:
    由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。动态代理类:在程序运行时,运用反射机制动态创建而成。
    由此可见,代理类可以为委托类预处理消息、把消息转发给委托类和事后处理消息等。
    例程1 HelloService.java
    package proxy;
    import java.util.Date;
    public interface HelloService{
    public String echo(String msg);
    public Date getTime();
    }
    2.动态代理类
    与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。
    Proxy类提供了创建动态代理类及其实例的静态方法。
    (1)getProxyClass()静态方法负责创建动态代理类,它的完整定义如下:
    public static Class<?> getProxyClass(ClassLoader loader, Class<?>[] interfaces) throws IllegalArgumentException
    参数loader 指定动态代理类的类加载器,参数interfaces 指定动态代理类需要实现的所有接口。
    (2)newProxyInstance()静态方法负责创建动态代理类的实例,它的完整定义如下:
    public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler) throws
    IllegalArgumentException
    参数loader 指定动态代理类的类加载器,参数interfaces 指定动态代理类需要实现的所有接口,参数handler 指定与动态代理类关联的 InvocationHandler 对象。
    以下两种方式都创建了实现Foo接口的动态代理类的实例:
    /**** 方式一 ****/
    //创建InvocationHandler对象
    InvocationHandler handler = new MyInvocationHandler(...);
    //创建动态代理类
    Class proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), new Class[] { Foo.class });
    //创建动态代理类的实例
    Foo foo = (Foo) proxyClass.getConstructor(new Class[] { InvocationHandler.class }).
    newInstance(new Object[] { handler });
    /**** 方式二 ****/
    //创建InvocationHandler对象
    InvocationHandler handler = new MyInvocationHandler(...);
    //直接创建动态代理类的实例
    Foo foo = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),new Class[] { Foo.class }, handler);
    由Proxy类的静态方法创建的动态代理类具有以下特点:
    动态代理类是public、final和非抽象类型的;
    动态代理类继承了java.lang.reflect.Proxy类;
    动态代理类的名字以“$Proxy”开头;
    动态代理类实现getProxyClass()和newProxyInstance()方法中参数interfaces指定的所有接口;WwW.yiJitAO.c∽om

    Q4:Spring事务管理是动态代理还是静态代理? CGLB支持动态代理吗?因为我听老师说CGLB是静态代理

    JDK动态代理是运行时生成代理对象,其特点是有一个原对象实例,有一个代理对象实例,代理对象内部持有原对象的引用。
    而CGLIB代理是运行时先编译一个新的类,直接在字节码的层级上把代码添加进原方法中,运行时只有一个动态生成的新类的实例,不存在源对象实例。
    Spring同时支持这两种代理方式,但是因为JDK动态代理只能进行接口的代理,如果你要代理的对象没有实现接口,那就不能采取JDK动态代理,而会采用CGLIB代理。
    一般情况下优先采用JDK动态代理,虽然其效率似乎比不上CGLIB代理,但是其对象用完之后可以正常释放。但是CGLIB代理每代理一个对象,都会产生一个新类。而类一旦载入JVM,按照大部分JVM的机制,这些新类占用的内存不会释放。J2EE程序一般运行时间都很长,内存上会有一些压力。

    相关文章
    抖音动态壁纸怎么设置2018-09-14
    怎样做公众号动态图2019-01-17
    微信动态表情制作软件2019-01-24
    电脑如何设置动态桌面2019-02-17
    如何删除空间全部动态2019-02-18
    如何制作微信动态表情2019-02-19
    如何区分使用动态模型还是静态模型2019-02-19
    怎样设置电脑动态壁纸2019-02-19
    如何设置不看他的动态2019-02-19
    excel如何建立动态图表2019-02-21