国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Java基礎之動(dòng)態(tài)代理Cglib詳解

發(fā)布時(shí)間:2021-07-17 21:51 來(lái)源:腳本之家 閱讀:0 作者:Q z1997 欄目: 編程語(yǔ)言 歡迎投稿:712375056

目錄

一、前言

經(jīng)測試,jdk創(chuàng )建對象的速度遠大于cglib,這是由于cglib創(chuàng )建對象時(shí)需要操作字節碼。cglib執行速度略大于jdk,所以比較適合單例模式。另外由于CGLIB的大部分類(lèi)是直接對Java字節碼進(jìn)行操作,這樣生成的類(lèi)會(huì )在Java的永久堆中。如果動(dòng)態(tài)代理操作過(guò)多,容易造成永久堆滿(mǎn),觸發(fā)OutOfMemory異常。spring默認使用jdk動(dòng)態(tài)代理,如果類(lèi)沒(mé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 結果
     */
    public String preOrder(String orderNo) {
        System.out.println("OrderServiceImpl.preOrder" + orderNo);
        return "下單成功";
    }

    /**
     * 下單
     *
     * @return 結果
     */
    public String list() {
        return "list";
    }
}

三、代理工廠(chǎng)

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 通過(guò)繼承的方式 實(shí)習代理
 * final類(lèi) 和 final 方法 不能代理
 * <p>
 * <br/>
 * @Author: Qz1997
 * @create 2021/5/1 13:24
 */
public class CglibProxyFactory implements MethodInterceptor {

    /**
     * 創(chuàng  )建一個(gè)代理對象
     *
     * @param clazz 類(lèi)型
     * @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);
        }
        /// // 判斷這個(gè)方法上是否包含某個(gè)注解
        // if (method.isAnnotationPresent(Async.class)) {
        //     // ....進(jìn)行一頓增強
        //     // return method.invoke(proxy, arg);
        // }
        Parameter[] parameters = method.getParameters();
        Parameter parameter = parameters[0];
        Class<?> type = parameter.getType();
        // 類(lèi)型為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ā)動(dòng)訂單短信");
        }
        return result;
    }

}

四、結果


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

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

天天摸日日摸爽爽狠狠| 久久亚洲AV无码精品色午夜| CHINESE国产AV巨作VIDEOS| 亚洲综合无码一区二区三区| 自拍偷自拍亚洲精品牛影院| 四虎国产精品永久地址49|