最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java基礎(chǔ)之動態(tài)代理Cglib詳解

 更新時間:2021年05月07日 11:34:59   作者:Q z1997  
這篇文章主要介紹了Java基礎(chǔ)之動態(tài)代理Cglib詳解,文中有非常詳細的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下

一、前言

經(jīng)測試,jdk創(chuàng)建對象的速度遠大于cglib,這是由于cglib創(chuàng)建對象時需要操作字節(jié)碼。cglib執(zhí)行速度略大于jdk,所以比較適合單例模式。另外由于CGLIB的大部分類是直接對Java字節(jié)碼進行操作,這樣生成的類會在Java的永久堆中。如果動態(tài)代理操作過多,容易造成永久堆滿,觸發(fā)OutOfMemory異常。spring默認使用jdk動態(tài)代理,如果類沒有接口,則使用cglib。

二、服務(wù)

package proxy.cglib;

/**
 * @Description: <br/>
 * 訂單服務(wù)
 * <p>
 * <br/>
 * @Author: Qz1997
 * @create 2021/5/1 10:51
 */
public class OrderServiceImpl {
    /**
     * 下單
     *
     * @param orderNo 訂單號
     * @return 結(jié)果
     */
    public String preOrder(String orderNo) {
        System.out.println("OrderServiceImpl.preOrder" + orderNo);
        return "下單成功";
    }

    /**
     * 下單
     *
     * @return 結(jié)果
     */
    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 通過繼承的方式 實習(xí)代理
 * final類 和 final 方法 不能代理
 * <p>
 * <br/>
 * @Author: Qz1997
 * @create 2021/5/1 13:24
 */
public class CglibProxyFactory implements MethodInterceptor {

    /**
     * 創(chuàng)建一個代理對象
     *
     * @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        方法參數(shù)
     * @param methodProxy 代理方法
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object proxyObject, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        // 判斷方法參數(shù) 如果是null || 參數(shù)格式 <= 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("發(fā)動訂單短信");
        }
        return result;
    }

}

四、結(jié)果

在這里插入圖片描述
在這里插入圖片描述

到此這篇關(guān)于Java基礎(chǔ)之動態(tài)代理Cglib詳解的文章就介紹到這了,更多相關(guān)Java動態(tài)代理Cglib內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java idea如何根據(jù)請求路徑url自動找到對應(yīng)controller方法插件

    java idea如何根據(jù)請求路徑url自動找到對應(yīng)controller方法插件

    這篇文章主要介紹了java idea如何根據(jù)請求路徑url自動找到對應(yīng)controller方法插件,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 通過Java實現(xiàn)中文分詞與文本關(guān)鍵詞提取

    通過Java實現(xiàn)中文分詞與文本關(guān)鍵詞提取

    這篇文章主要為大家詳細介紹了如何利用Java實現(xiàn)中文分詞以及文本關(guān)鍵詞提取功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)學(xué)習(xí)
    2023-06-06
  • 詳解Java中常見語法糖的使用

    詳解Java中常見語法糖的使用

    語法糖(Syntactic Sugar),也稱糖衣語法,是由英國計算機學(xué)家 Peter.J.Landin 發(fā)明的一個術(shù)語,指在計算機語言中添加的某種語法,本文主要為大家分享了12個java中常見的語法糖,感興趣的小伙伴可以了解下
    2023-11-11
  • 用Java連接sqlserver數(shù)據(jù)庫時候幾個jar包的區(qū)別分析

    用Java連接sqlserver數(shù)據(jù)庫時候幾個jar包的區(qū)別分析

    這篇文章主要介紹了用Java連接sqlserver數(shù)據(jù)庫時候幾個jar包的區(qū)別分析,需要的朋友可以參考下
    2014-10-10
  • SpringBoot注解@CrossOrigin使用詳解

    SpringBoot注解@CrossOrigin使用詳解

    這篇文章主要介紹了SpringBoot注解@CrossOrigin使用詳解,@CrossOrigin是用來處理跨域請求的注解
    跨域,指的是瀏覽器不能執(zhí)行其他網(wǎng)站的腳本,它是由瀏覽器的同源策略造成的,是瀏覽器對JavaScript施加的安全限制,需要的朋友可以參考下
    2023-12-12
  • spring boot如何實現(xiàn)切割分片上傳

    spring boot如何實現(xiàn)切割分片上傳

    這篇文章主要介紹了spring boot如何實現(xiàn)切割分片上傳,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Java基礎(chǔ)教程之封裝與接口

    Java基礎(chǔ)教程之封裝與接口

    這篇文章主要介紹了Java基礎(chǔ)教程之封裝與接口,本文用淺顯易懂的語言講解了Java中的封裝與接口,很形象的說明了這兩個面向?qū)ο笮g(shù)語,需要的朋友可以參考下
    2014-08-08
  • 聊聊Object類中的wait()和notify()方法

    聊聊Object類中的wait()和notify()方法

    這篇文章主要介紹了Object類中的wait()和notify()方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 模擬Mybatis的實現(xiàn)方法

    模擬Mybatis的實現(xiàn)方法

    本文通過實例代碼給大家分享了模擬Mybatis的實現(xiàn)方法,需要的朋友參考下吧
    2017-09-09
  • Java操作集合工具類Collections使用詳解

    Java操作集合工具類Collections使用詳解

    這篇文章主要介紹了java操作集合工具類Collections使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12

最新評論

堆龙德庆县| 栖霞市| 浑源县| 通辽市| 临洮县| 南康市| 凤翔县| 搜索| 铜鼓县| 洛隆县| 即墨市| 泸水县| 景泰县| 武强县| 永嘉县| 洪洞县| 时尚| 昆山市| 讷河市| 客服| 萨迦县| 永仁县| 宁明县| 临湘市| 阳信县| 西平县| 衡水市| 承德市| 旅游| 沂源县| 策勒县| 舞阳县| 南开区| 泸定县| 文安县| 达孜县| 舒兰市| 冕宁县| 佛学| 龙口市| 平武县|