• 关于动态代理的一些理解


    动态代理:

               特征:

                           字节码随用随创建,随用随加载

               作用:

                           不修改源码的基础上,对已有方法进行加强

                 优势:

                          去除重复代码,对重复代码进行统一管理和调配

                            取出重复代码:

                                                      可以提高开发效率

                                                       降低代码间的依赖关系

                                                       降低代码的维护成本

    分类:

               基于接口的动态代理:

                    提供者:JDK官方

                     使用要求:被代理对象至少实现一个接口

                  创建代理对象的类:Proxy

                 创建代理对象的方法:newProxyInstance()

               创建代理对象方法的三个参数(由于jdk检查非常严格,所有在代理被代理对象时,需要具备与被代理对象有一样的特征才能瞒过jdk的检查):

                                           ClassLoader :类加载器

                                                                需要有和被代理对象一样的类加载器

                                                                例如:被代理对象为User 则加载器为User.class.getClassLoader()

                                                               注意:类加载器不是写谁都行!

                                                                            java有三个加载器:java是通过层层加载的(父类加载委托机制:当加载时都要判断父类是否加载,如果父类已经加载,则子类不加载,反之,父类没有加载,则子类才进行加载

                                                                                第一个:Bootstrap:

                                                                                              它是嵌套在java虚拟机中的二进制程序,负责加载jdk中的rt,.jar,tools.jar等

                                                                                第二个:ExClassLoader

                                                                                                 它只负责加载jdk中扩展目录的字节码

                                                                                                java目录下的jrelibext

                                                                                第三个:AppClassLoader

                                                                                             它负责加载我们自己写的类的字节码,还包括我们导入的lib的字节码

                                                                       

         

                                               Class[] : 字节码数组

                                                                让被代理对象和代理对象具有相同的行为(方法)

                                                                  和被代理对象实现相同的接口即可。

                                                                如对象为普通类User 则 User.getClass().getInterfaces();

                                                                如果被代理的是一个接口:

                                                                如对象为UserDao 则: new Class[  ]{UserDao.class}

                                           InvocationHadler:提供增强代码的接口。谁用谁来写一个该接口的实现类,通常写的是匿名内部类

               基于子类的代理对象:

                                  提供者:第三方cglib

                                  使用要求:被代理类不能使最终类。不能被final修饰

                                  创建代理对象的类:Enhancer

                                  创建代理对象的方法:create();

                                  创建代理对象方法的参数:

                                                      Class

                                                      Callback:它里面没有方法,我们用的是它的子接口MethodInterceptor

                                                      

                                                     

  • 相关阅读:
    【bzoj3083】遥远的国度 树链剖分+线段树
    【bzoj2226】[Spoj 5971] LCMSum 欧拉函数
    xml、json的序列化与反序列化
    什么是安全证书,访问者到底是怎么校验安全证书的,服务端返回安全证书后,客户端再向谁验证呢?
    查看发票组代码后的总结和有感
    网址的正则表达式、常用正则表达式、在线正则表达式检测
    XamlParseException异常
    委托,lambda,匿名方法
    windows中断与共享的连接(samba)
    linux ubuntu 11.04 samba 服务器设置
  • 原文地址:https://www.cnblogs.com/create-and-orange/p/11017912.html
Copyright © 2020-2023  润新知