jdk动态代理

作者: 山东大葱哥 | 来源:发表于2019-05-25 08:20 被阅读9次

    动态代理介绍

    1.概念
    动态代理是指动态的在内存中构建代理对象,动态是相对于静态代理而言的。
    有两个重要特点:

    • 动态的
    • 内存中构建
    1. 实现方式
    • jdk动态代理
    • cglib动态代理

    jdk动态代理的概念

    • 代理类在程序调用到代理类对象时才由JVM真正创建
    • 通过反射类Proxy以及InvocationHandler回调接口实现的
    • 基于反射机制,JVM根据传进来的业务实现类对象以及 方法名 ,动态地创建了一个 代理类的class文件并被字节码引擎执行,然后通过该代理类对象进行方法调用。
    • 我们需要做的,只需指定代理类的预处理、调用后操作即可。

    jdk动态代理的组成

    • 业务接口
    • 业务实现类, 负责实现主要的业务方法
    • 调用处理器,实现调用管理接口InvocationHandler创建动态代理类

    案例演示

    1. 业务接口(同静态代理)

    2. 业务实现类(同静态代理)

    3. 调用处理器

      public class JDKProxy implements InvocationHandler {
          private Object target;//真正的业务实现类对象,用来调用具体的业务方法
      
          /**
           * 绑定业务对象并返回一个代理类
           */
          public Object bind(Object target) {
              this.target = target;  //接收业务实现类对象参数
      
              //通过反射机制,创建一个代理类对象实例并返回。用户进行方法调用时使用
              //创建代理对象时,需要传递该业务类的类加载器(用来获取业务实现类的元数据,
              // 在包装方法是调用真正的业务方法)、接口、handler实现类
              return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                      target.getClass().getInterfaces(), this);
          }
      
          /**
           * 包装调用方法:进行预处理、调用后处理
           */
          @Override
          public Object invoke(Object proxy, Method method, Object[] args)
                  throws Throwable {
              Object result = null;
              System.out.println("预处理操作——————");
              //调用真正的业务方法
              result = method.invoke(target, args);
      
              System.out.println("调用后处理——————");
              return result;
          }
      
      }
      
    4. 业务调用

      public class JDKProxyApplication {
          public static void main(String[] args) {        
              IAccountService accountService = new AccountServiceImpl();
              JDKProxy proxy = new JDKProxy();
              IAccountService accountServiceProxy = (IAccountService) proxy.bind(accountService);
              accountServiceProxy.queryAccount();
              accountServiceProxy.updateAccount();
          }
      }
      

    jdk动态代理特点及问题分析

    1. 特点分析
    • jdk动态代理需要使用业务实现类所实现的接口作为参数。
    1. 问题分析
    • 如果业务实现类是没有实现接口而是直接定义业务方法的话,就无法使用jdk动态代理了。
    • 如果业务实现类中新增了接口中没有的方法,这些方法是无法被代理的。

    相关文章

      网友评论

        本文标题:jdk动态代理

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