java动态代理技术

为什么需要动态代理技术

  • 如果对象身上干的事太多可以通过代理技术转移部分功能
  • 对象有什么办法需要被代理,代理就必须要有一定的方法

怎么实现动态代理 

  • 创建对象

    • public class 对象名 implement 接口{
          private String name;
          
          public 对象名(String name){
              this.name = name;
          }
          
          public String 功能1(){
              功能实现
          }
      
          public String 功能2(){
              功能实现
          }
      }
  • 创建接口

    • 功能:是为了让对象和代理拥有统一的功能
  • 创建代理

    • 重写InvocationHandle 中的invoke方法 invoke方法决定着代理要干什么事
    • invoke是动态代理中最重要的方法
    • 外部调用代理对象的方法
    • // 对象 dxProxy = ProxyUtil.createProxy(s);
      // dxProxy.功能1("xxx") starProxy.功能2()
       
    • public class 代理对象{
          public static Star createProxy(对象 duixiang){
             /* newProxyInstance(ClassLoader loader,
                      Class<?>[] interfaces,
                      InvocationHandler h)
                      参数1:用于指定一个类加载器
                      参数2:指定生成的代理长什么样子,也就是有哪些方法
                      参数3:用来指定生成的代理对象要干什么事情
                      */
                                                         获取当前类的类加载器       
              对象 dxProxy = (对象) Proxy.newProxyInstance(代理对象.getClassLoader(),
                      new Class[]{对象.class}, new InvocationHandler() {
                          @Override // 回调方法
                          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                              // 代理对象要做的事情,会在这里写代码
                              if(method.getName().equals("sing")){
                                  System.out.println("准备话筒,收钱20万");
                              }else if(method.getName().equals("dance")){
                                  System.out.println("准备场地,收钱1000万");
                              }
                              return method.invoke(bigStar, args);
                          }
                      });
              return dxProxy;
          }
      }
  • 实现代理功能

  • public class Test {
        public static void main(String[] args) {
            对象 d = new 对象("超人吉吉");
            接口 接口Proxy = ProxyUtil.createProxy(d); 创建对象将对象传入代理
    
            String rs = 接口Proxy.功能("变身");
            System.out.println(rs);
    
        }
    }

什么情况下使用动态代理技术

当代码中出现大量重复代码时,我们可以使用动态代理技术将相同的代码放到invoke中去

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋进的大马猴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值