Java基础之动态代理Cglib详解

 更新时间:2021年05月07日 11:34:59   作者:Q z1997  
这篇文章主要介绍了Java基础之动态代理Cglib详解,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有非常好的帮助,需要的朋友可以参考下

一、前言

经测试,jdk创建对象的速度远大于cglib,这是由于cglib创建对象时需要操作字节码。cglib执行速度略大于jdk,所以比较适合单例模式。另外由于CGLIB的大部分类是直接对Java字节码进行操作,这样生成的类会在Java的永久堆中。如果动态代理操作过多,容易造成永久堆满,触发OutOfMemory异常。spring默认使用jdk动态代理,如果类没有接口,则使用cglib。

二、服务

package proxy.cglib;

/**
 * @Description: <br/>
 * 订单服务
 * <p>
 * <br/>
 * @Author: Qz1997
 * @create 2021/5/1 10:51
 */
public class OrderServiceImpl {
    /**
     * 下单
     *
     * @param orderNo 订单号
     * @return 结果
     */
    public String preOrder(String orderNo) {
        System.out.println("OrderServiceImpl.preOrder" + orderNo);
        return "下单成功";
    }

    /**
     * 下单
     *
     * @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;

/**
 * @Description: <br/>
 * Cglib 通过继承的方式 实习代理
 * final类 和 final 方法 不能代理
 * <p>
 * <br/>
 * @Author: Qz1997
 * @create 2021/5/1 13:24
 */
public class CglibProxyFactory implements MethodInterceptor {

    /**
     * 创建一个代理对象
     *
     * @param clazz 类型
     * @return 代理对象
     */
    public Object creatProxyedObj(Class<?> clazz) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        return enhancer.create();
    }

    /**
     * 代理方法
     *
     * @param proxyObject 代理对象
     * @param method      方法
     * @param args        方法参数
     * @param methodProxy 代理方法
     * @return
     * @throws Throwable
     */
    @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详解的文章就介绍到这了,更多相关Java动态代理Cglib内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JVM调优参数的设置

    JVM调优参数的设置

    Java虚拟机的调优是一个复杂而关键的任务,可以通过多种参数来实现,本文就来介绍一下JVM调优参数的设置,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Struts2的配置文件方法小结

    Struts2的配置文件方法小结

    最近正在学习Struts2,在配置文件中遇到好多标签,各种意义不同。下面这篇文章就来给大家介绍关于Struts2配置文件的相关资料,文中通过图文介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • Java中常见的并发控制手段浅析

    Java中常见的并发控制手段浅析

    所谓并发控制就是帮助我们程序员更容易的让线程之间合作,让线程之间相互配合来满足业务逻辑,这篇文章主要给大家介绍了关于Java中常见的并发控制手段的相关资料,需要的朋友可以参考下
    2021-08-08
  • 在启动后台 jar包时,使用指定的 application.yml操作

    在启动后台 jar包时,使用指定的 application.yml操作

    这篇文章主要介绍了在启动后台 jar包时,使用指定的 application.yml操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Java整合mybatis实现过滤数据

    Java整合mybatis实现过滤数据

    这篇文章主要介绍了Java整合mybatis实现过滤数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • Java实现上传文件图片到指定服务器目录

    Java实现上传文件图片到指定服务器目录

    本文通过实例代码给大家介绍了java上传文件图片到指定服务器目录的相关知识,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • Feign 日期格式转换错误的问题

    Feign 日期格式转换错误的问题

    这篇文章主要介绍了Feign 日期格式转换错误的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • spring  mybatis多数据源实例详解

    spring mybatis多数据源实例详解

    本文主要介绍sping mybatis多数据源处理,在开发过程中经常会遇到多个数据库,这里给大家举例说明如何处理,希望能帮助有需要的小伙伴
    2016-07-07
  • 用拦截器修改返回response,对特定的返回进行修改操作

    用拦截器修改返回response,对特定的返回进行修改操作

    这篇文章主要介绍了用拦截器修改返回response,对特定的返回进行修改操作。具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • AQS同步组件CyclicBarrier循环屏障用例剖析

    AQS同步组件CyclicBarrier循环屏障用例剖析

    这篇文章主要为大家介绍了AQS同步组件CyclicBarrier循环屏障用例剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08

最新评论