中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Java中動態代理Cglib

發布時間:2021-05-07 15:08:52 來源:億速云 閱讀:144 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關怎么在Java中動態代理Cglib,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

常用的java框架有哪些

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 {
    /**
     * 下單
     *
     * @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

關于怎么在Java中動態代理Cglib就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

灵台县| 芷江| 晋中市| 拜城县| 望谟县| 潞西市| 库伦旗| 伊春市| 响水县| 克什克腾旗| 青海省| 西林县| 曲阜市| 钟祥市| 高雄县| 灵璧县| 塔城市| 新密市| 开远市| 都江堰市| 绥江县| 南平市| 杨浦区| 武宣县| 唐山市| 忻州市| 大姚县| 雷山县| 广东省| 水富县| 张家港市| 麻栗坡县| 南岸区| 淮阳县| 中阳县| 综艺| 全州县| 高邑县| 正定县| 嘉义县| 贵南县|