设计模式之代理模式
系列文章目录
第一篇:设计模式之观察者模式
第二篇:设计模式之代理模式
文章目录
- 系列文章目录
- 前言
- 一、静态代理
- 二、动态代理
-
-
- 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