设计模式之代理模式

本文深入探讨了静态代理和动态代理的概念,包括基于接口的jdk动态代理和基于类的cglib动态代理。通过具体示例,展示了如何利用java.lang.reflect.Proxy类和InvocationHandler接口实现动态代理,以及cglib的动态代理生成过程。

静态代理模式

  • 真实角色

  • 代理角色(自定义)

  • 两个角色实现同一接口

  • 实现方式:继承 VS 聚合(构造方法为真实对象赋值)
  • 例:线程Thread

// 产生一个代理对象
Thread proxy = new Thread(new Runnable() {
     public void run() {}
});
// 调用代理对象的方法
proxy.start();

1013480-20190411183719393-45799864.png

动态代理

  • 基于接口:jdk自带的动态代理

    • java.lang.reflect.Proxy类提供用于创建动态代理类和实例的静态方法

    • java.lang.reflect.InvocationHandler接口

      • 通过 invoke() 实现对真实角色的代理访问
      • 每次通过Proxy生成代理对象时都要指定对应的InvocationHandler对象
public class ProxyInvocationHandler implements InvocationHandler {
  //真实对象
  private Object target;
  public ProxyInvocationHandler(Object target) {
     this.target = target;
  }
  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
     System.out.println("代理方法开始.....");

     Object result = method.invoke(target, args);
     System.out.println("代理方法结束.....");
     return result;

  }

}
// 测试方法
public void test() {
  Role realRole = new RealRole();
  ProxyInvocationHandler handler = new ProxyInvocationHandler(realRole);

  // 生成代理类

  Role proxy = (Role) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),realRole.getClass().getInterfaces(),handler);
  // 实际上会调用 handler 的 invoke 方法

  proxy.sing();

}
  • 基于类:cglib
  • 使用 javassist 生成动态代理

转载于:https://www.cnblogs.com/mabaoqing/p/10691574.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值