首页 > 编程语言 > 详细

Spring_13_代理模式(基于JDK的动态代理)

时间:2021-05-11 16:41:42      阅读:20      评论:0      收藏:0      [点我收藏+]

代理模式

  * 作用:代理模式给某一个对象提供一个代理对象,并由代理对象来控制对原对象的引用,在不修改原对象代码的基础上,对原对象的功能进行修改或增强。
  
  * 代理模式分为 静态代理 和 动态代理

      - 静态代理是由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行之前,代理类.class文件就已经被创建了。

      - 动态代理是在程序运行时通过反射机制动态创建的。动态代理技术是在内存中生成对象的一种技术,也就是整个代理过程在内存中进行,我们不需要手写代理类的代码,也不会存在代理类的编译过程,而是直接在运行期凭空造出 
        一个代理对象供我们使用。
  
  * 动态代理技术有一下两种实现:

     - 基础JDK接口的动态代理:JDK自带的动态代理技术,需要用一个静态方法来创建代理对象,它要求被代理对象,也就是目标类,必须实现接口,生成的代理对象和原对象都实现了相同的接口,是兄弟关系。

     - 基础CJLIB的动态代理:

 
  * JDK动态代理参数详解

       Proxy.newProxyInstance(ClassLoader loader,Class<?>[] Interfaces(), InvocationHandler invocationHandler )

       -   ClassLoader loader: 指定被代理对象的类加载器,用户加载目标类(被代理类)及其接口的字节码文件。 使用getClassLoader()获取。     例如: Customer.class.getClassLoader(),  Customer类的类加载器。

       -   Class<?>[] Interfaces() :指定被加载对象所实现的所有接口的字节码对象数组,使用getInterfaces()获取。 例如;  Customer.class.getInterfaces()

       -   InvocationHandler 这是一个接口,主要使用该接口中的invoke()方法 : public Object invoke(Object proxy,  Method method,  Object[] args1),该方法会在代理类对象调用方法时执行,
           也就是说在代理类对象调用父接口中的任意方法时,invoke()方法都会执行。所以我们在此方法中完成对代码的增强和扩展。
  
       - invoke() 方法参数详解   public Object invoke(Object proxy,  Method method,  Object[] args)

             - proxy代理类对象的引用,也就是Proxy.newProxyInstance()方法的返回值。

             - method:对应的是触发invoke()方法执行的method对象。 例如:代理对象调用了XXX方法,那么该方法就会触发invoke()方法执行,那么此时method对应的就是xxx方法。

             - Object[] args : 代理对象调用方法时,传递的实际参数

   * 基于接口的动态代理,实际上是在内存中生成了一个代理对象,该代理对象实现了目标对象(被代理对象)的所有接口,所以代理对象和目标对象是兄弟关系,共同实现了一个同一个接口。

   - 动态代理类代码:
     ```
            public class DynamicTest {
                public static void main(final String[] args) {
                    //准备一个被代理的对象
                    final Customer customer=new Customer();

                    //使用JDK自带API 创建动态代理对象
                    OrderInterface deliverClerk= (OrderInterface) Proxy.newProxyInstance(Customer.class.getClassLoader(),
                                           Customer.class.getInterfaces(),
                                           new InvocationHandler() {
                                                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                                                    Object result=method.invoke(customer,args);
                                                    return result;
                                                }
                                            }
                                    );

                    //调用代理对象执行对应方法
                    String result=deliverClerk.Order("麻婆豆腐");
                    System.out.println(result);

                }
        }

     ```
     ```
     顾客类
            public class Customer implements OrderInterface {
                public String Order(String foodName) {
                    return "已经下单点了"+foodName;
                }

                public void pay() {

                }

                public void shout() {

                }
            }


     ```
     ```  

    接口
      public interface OrderInterface {
        //点餐 并指定菜名
        public String Order(String foodName);

        //付款
        public void pay();

        //叫服务员
        public void shout();

    }

Spring_13_代理模式(基于JDK的动态代理)

原文:https://www.cnblogs.com/szqengr/p/14754899.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!