> 文档中心 > 设计模式之代理模式

设计模式之代理模式


系列文章目录

第一篇:设计模式之观察者模式
第二篇:设计模式之代理模式


文章目录

  • 系列文章目录
  • 前言
  • 一、静态代理
  • 二、动态代理
      • 1.1 Jdk 代理
      • 1.2 Cglib 代理
  • 总结

前言

主要解决:在直接访问对象时带来的问题

何时使用:想在访问一个类时做一些控制,或者想要为类中的某个方法添加新的功能


提示:以下是本篇文章正文内容,下面案例可供参考

一、静态代理

// 代理接口public interface Users {    public void addUser();}// 实现类class UserInfo implements Users{    public void addUser() { System.out.println("添加用户");    }}//代理类class UserProxyImpl implements Users{//通过代理接口属性注入    private Users users;// 通过构造方法传入代理对象    public UserProxyImpl(Users users) { this.users = users;    }// 实现代理方法    public void addUser() { System.out.println("开始添加用户。。。"); // 代理方法一般只做增强,不做修改,原来的逻辑不动 users.addUser();// 调用原来的方法 System.out.println("添加成功。。。");    }    public static void main(String[] args) { Users users=new UserProxyImpl(new UserInfo()); users.addUser();    }}

二、动态代理

1.1 Jdk 代理

// 代理接口public interface Color {    void scribble();}// 代理接口实现类public class Green implements Color{    @Override    public void scribble() { System.out.println("绿色"); }}// 代理类public class ColorProxy implements InvocationHandler {    private Color color;    public ColorProxy(Color color) { this.color = color;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {    // 此处可以实现自己的逻辑  return method.invoke(color,args);    }    public <T> T getProxy() { return (T) Proxy.newProxyInstance(color.getClass().getClassLoader(),color.getClass().getInterfaces(),this);    }    public static void main(String[] args) {// 调用代理类实现增强 Color green = new ColorProxy(new Green()).getProxy(); green.scribble();    }}

1.2 Cglib 代理

// 代理类class Hello1 {    public String hello() { System.out.println("excute hello method"); return "hello cglib";    }}// 实现MethodInterceptor 接口public class CglibDemo implements MethodInterceptor {    public static Object getTarget(Object object){ Enhancer enchaner = new Enhancer(); enchaner.setSuperclass(Hello1.class); enchaner.setCallback(this); return enchaner.create();    }    @Override    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { return methodProxy.invokeSuper(o, objects);    }    public static void main(String[] args) { Hello1 target = (Hello1) new CglibDemo().getTarget(); System.out.println(target.hello());    }}

总结

后话,想要深入了解Jdk代理需要去了解Java asm框架
ASM是一个通用的 Java 字节码操作和分析框架。它可用于直接以二进制形式修改现有类或动态生成类。ASM 提供了一些常见的字节码转换和分析算法,可以从中构建自定义的复杂转换和代码分析工具。ASM 提供与其他 Java 字节码框架类似的功能,但侧重于 性能。因为它被设计和实现为尽可能小和尽可能快,所以它非常适合在动态系统中使用(当然也可以以静态方式使用,例如在编译器中)

Asm 官方网址 :https://asm.ow2.io/index.html

51银饰网