关于动态代理的一些理解

动态代理:

           特征:

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

           作用:

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

             优势:

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

                        取出重复代码:

                                                  可以提高开发效率

                                                   降低代码间的依赖关系

                                                   降低代码的维护成本

分类:

           基于接口的动态代理:

                提供者:JDK官方

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

              创建代理对象的类:Proxy

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

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

                                       ClassLoader :类加载器

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

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

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

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

                                                                            第一个:Bootstrap:

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

                                                                            第二个:ExClassLoader

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

                                                                                            java目录下的\jre\lib\ext

                                                                            第三个:AppClassLoader

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

                                                                   

     

                                           Class[] : 字节码数组

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

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

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

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

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

 

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

           基于子类的代理对象:

                              提供者:第三方cglib

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

                              创建代理对象的类:Enhancer

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

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

                                                  Class

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

                                                  

                                                 

posted @ 2019-06-13 17:22  创造与橙子1994  阅读(275)  评论(0编辑  收藏  举报