当前位置: 首页 > news >正文

java 动态代理详解

cglib 动态代理

介绍

CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB 是一个好的选择。

原理

CGLIB 原理:动态生成一个要代理类的子类,子类重写要代理的类的所有不是 final 的方法。在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。
CGLIB 底层:采用ASM字节码生成框架,使用字节码技术生成代理类,比使用 Java 反射效率要高。

示例

定义一个被代理类
定义一个拦截器并实现接口 MethodInterceptor
代理工厂类
通过代理对象调用方法

Student:被代理类

public class Student {public void handOut() {System.out.println("学生交作业。");}
}

CglibProxy:拦截器

public class CglibProxy implements MethodInterceptor {/*** @param o: 代理对象* @param method: 被代理方法* @param params: 方法入参* @param methodProxy: CGLIB方法**/@Overridepublic Object intercept(Object o, Method method, Object[] params, MethodProxy methodProxy) throws Throwable {System.out.println("【增强方法】代理对象正在执行的方法:" + method.getName());Object result = methodProxy.invokeSuper(o, params);return result;}
}

CglibProxyFactory:代理工厂类

public class CglibProxyFactory {public static Object creatCglibProxyObj(Class<?> clazz) {Enhancer enhancer = new Enhancer();// 为加强器指定要代理的业务类(即为下面生成的代理类指定父类)enhancer.setSuperclass(clazz);// 设置回调:对于代理类上所有方法的调用,都会调用CallBack,而Callback则需要实现intercept()方法enhancer.setCallback(new CglibProxy());return enhancer.create();}
}

测试:

public class Test {public static void main(String[] args) {Student studentProxy = (Student)CglibProxyFactory.creatCglibProxyObj(Student.class);studentProxy.handOut();}
}

待续…

cglib代理工具详解

jdk代理模式详解

http://www.lryc.cn/news/347362.html

相关文章:

  • Web路径专题
  • 解决vue3项目打包后部署后某些静态资源图片不加载问题
  • 传感网应用开发教程--AT指令访问新大陆云平台(ESP8266模块+物联网云+TCP)
  • 项目提交到空的git仓库流程
  • 【Python】在Windows Server上部署Flask后端服务器
  • 机器学习作业4——朴素贝叶斯分类器
  • BUU-[GXYCTF2019]Ping Ping Ping
  • 代码随想录Day 41|Leetcode|Python|198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III
  • 【吴恩达机器学习-week2】多个变量的特征缩放和学习率问题
  • C#字符串的拼接
  • 哈希表Hash table
  • jdk8新特性----Lambda表达式
  • 在STM32中用寄存器方式点亮流水灯
  • TCP(TCP客户端、服务器如何通信)
  • pdf 文件版面分析--PyMuPDF (python 文档解析提取)
  • sql update 多表关联 inner join
  • 【OceanBase诊断调优】—— 租户资源统计项及其查询方法
  • 【一键录音,轻松转换:用Python打造个性化音频记录工具】
  • Java类与对象(一)
  • python中的装饰器,例子说明
  • Leetcode经典题目之用队列实现栈
  • DBSCAN聚类算法
  • 【tauri】安装
  • (Java)心得:LeetCode——19.删除链表的倒数第 N 个节点
  • 树莓派安装opencv
  • bert 的MLM框架任务-梯度累积
  • Nginx配置/.well-known/pki-validation/
  • iOS LQG开发框架(持续更新)
  • Python 自动化脚本系列:第3集
  • Matlab-粒子群优化算法实现