这篇文章将为大家详细讲解有关怎么在Java中动态代理Cglib,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。常用的java框架有哪些1.springMVC,spring WEB mvc是一种
这篇文章将为大家详细讲解有关怎么在Java中动态代理Cglib,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
1.springMVC,spring WEB mvc是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架。2.shiro,Apache Shiro是Java的一个安全框架。3.mybatis,MyBatis 是支持普通 sql查询,存储过程和高级映射的优秀持久层框架。4.dubbo,Dubbo是一个分布式服务框架。5.Maven,Maven是个项目管理和构建自动化工具。6.RabbitMQ,RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。7.Ehcache,EhCache 是一个纯Java的进程内缓存框架。
经测试,jdk创建对象的速度远大于cglib,这是由于cglib创建对象时需要操作字节码。cglib执行速度略大于jdk,所以比较适合单例模式。另外由于CGLIB的大部分类是直接对Java字节码进行操作,这样生成的类会在Java的永久堆中。如果动态代理操作过多,容易造成永久堆满,触发OutOfMemory异常。spring默认使用jdk动态代理,如果类没有接口,则使用cglib。
package proxy.cglib;public class OrderServiceImpl { public String preOrder(String orderNo) { System.out.println("OrderServiceImpl.preOrder" + orderNo); return "下单成功"; } public String list() { return "list"; }}
package proxy.cglib;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;import java.lang.reflect.Parameter;import java.util.Objects;public class CglibProxyFactory implements MethodInterceptor { public Object creatProxyedObj(Class<?> clazz) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(clazz); enhancer.setCallback(this); return enhancer.create(); } @Override public Object intercept(Object proxyObject, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { // 判断方法参数 如果是null || 参数格式 <= 0 if (Objects.isNull(args) || args.length <= 0) { return methodProxy.invokeSuper(proxyObject, args); } /// // 判断这个方法上是否包含某个注解 // if (method.isAnnotationPresent(Async.class)) { // // ....进行一顿增强 // // return method.invoke(proxy, arg); // } Parameter[] parameters = method.getParameters(); Parameter parameter = parameters[0]; Class<?> type = parameter.getType(); // 类型为String if (type == String.class) { String orderNo = (String) args[0]; if (Objects.nonNull(orderNo) && orderNo.length() < 10) { throw new RuntimeException("订单号错误"); } } String result = (String) methodProxy.invokeSuper(proxyObject, args); if (Objects.equals(result, "下单成功")) { System.out.println("发动订单短信"); } return result; }}
关于怎么在Java中动态代理Cglib就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
--结束END--
本文标题: 怎么在Java中动态代理Cglib
本文链接: https://www.lsjlt.com/news/275845.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-21
2024-05-21
2024-05-21
2024-05-21
2024-05-21
2024-05-21
2024-05-21
2024-05-21
2024-05-21
2024-05-21
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0