日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

CGLIB 簡介

  • 為沒有實現接口的類提供代理

  • 更好的性能

CGLIB 原理

  • 原理:動態生成需要代理的子類,子類重寫代理類的非final方法。子類中采用方法攔截的奇數攔截所有父類的方法的調用,順勢織入橫切邏輯。

  • 底層:使用ASM字節碼處理框架。

  • 缺點:無法代理fianl方法。

CGLIB 應用

  • Spring AOP

圖片

CGLIB API

  • : 底層字節碼處理類,他們大部分與ASM有關系。

  • net.sf.cglib.transform: 編譯期或運行期類和類文件的轉換

  • net.sf.cglib.proxy: 實現創建代理和方法攔截器的類

  • net.sf.cglib.reflect: 實現快速反射和C#風格代理的類

  • net.sf.cglib.util: 集合排序等工具類

  • net.sf.cglib.beans: JAVABean相關的工具類

Code Example

Basic

package com.cclu.cglibproxy;
import java.util.HashMap;import java.util.Map;
/** * @author ChangCheng Lu * @date 2023/8/20 15:59 */public class UserService {
    private static final Map<String, String> nameMap;
    private static final Map<String, String> addressMap;
    static {        nameMap = new HashMap<>(3);        nameMap.put("1001", "木子");        nameMap.put("1002", "小一");        nameMap.put("1003", "阿同");
        addressMap = new HashMap<>(3);        addressMap.put("1001", "漣水");        addressMap.put("1002", "淮安");        addressMap.put("1003", "上海");    }
    public String getUserNameById(String userId) {        return nameMap.get(userId);    }
    public String getAddressById(String userId) {        return addressMap.get(userId);    }
}
package com.cclu.cglibproxy;
import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/** * @author ChangCheng Lu * @date 2023/8/20 16:04 */public class LogInterceptor implements MethodInterceptor {    @Override    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {        System.out.println("方法調用前...");        Object res = methodProxy.invokeSuper(o, objects);        System.out.println("方法調用后:"+res);        return res;    }}
package com.cclu.cglibproxy;
import net.sf.cglib.proxy.Enhancer;
/** * @author ChangCheng Lu * @date 2023/8/20 16:10 */public class Client {    public static void mAIn(String[] args) {        Enhancer enhancer = new Enhancer();        enhancer.setSuperclass(UserService.class);        enhancer.setCallback(new LogInterceptor());        UserService userService = (UserService) enhancer.create();        userService.getUserNameById("1001");        userService.getAddressById("1003");    }}

Filter、FixedValue

package com.cclu.cglibproxy;
import java.util.HashMap;import java.util.Map;
/** * @author ChangCheng Lu * @date 2023/8/20 15:59 */public class UserService {
    private static final Map<String, String> nameMap;
    private static final Map<String, String> addressMap;
    static {        nameMap = new HashMap<>(3);        nameMap.put("1001", "木子");        nameMap.put("1002", "小一");        nameMap.put("1003", "阿同");
        addressMap = new HashMap<>(3);        addressMap.put("1001", "蘇州");        addressMap.put("1002", "淮安");        addressMap.put("1003", "上海");    }
    public String getUserNameById(String userId) {        return nameMap.get(userId);    }
    public String getAddressById(String userId) {        return addressMap.get(userId);    }
}
package com.cclu.cglibproxy;
import net.sf.cglib.proxy.CallbackFilter;
import java.lang.reflect.Method;
/** * @author ChangCheng Lu * @date 2023/8/20 16:35 */public class LogInterceptorFilter implements CallbackFilter {    @Override    public int accept(Method method) {        if (method.getName().equals("getUserNameById")) {            System.out.println("是不是木子?");            return 1;        } else if (method.getName().equals("getAddressById")) {            System.out.println("是不是阿同?");            return 2;        }        return 0;    }}
package com.cclu.cglibproxy;
import net.sf.cglib.proxy.FixedValue;
/** * @author ChangCheng Lu * @date 2023/8/20 17:44 */public class TargetResultFixed implements FixedValue {    @Override    public Object loadObject() throws Exception {        System.out.println("鎖定結果");        Object obj = "蘇州";        return obj;    }}
package com.cclu.cglibproxy;
import net.sf.cglib.proxy.Callback;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.NoOp;import org.junit.Test;
/** * @author ChangCheng Lu * @date 2023/8/20 17:32 */public class ProxyTest {
    @Test    public void filterTest() {        Enhancer enhancer = new Enhancer();        enhancer.setSuperclass(UserService.class);        enhancer.setCallbackFilter(new LogInterceptorFilter());        enhancer.setCallbacks(new Callback[]{NoOp.INSTANCE, new LogInterceptor(), new TargetResultFixed()});
        UserService userService = (UserService) enhancer.create();        System.out.println(userService);        System.out.println(userService.getUserNameById("1001"));        System.out.println(userService.getAddressById("1003"));    }
}

參考文檔

  • https://www.runoob.com/w3cnote/cglibcode-generation-library-intro.html

分享到:
標簽:Cglib
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定