91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Java CGLib動態代理機制(全面解析)

發布時間:2020-09-23 00:47:18 來源:腳本之家 閱讀:155 作者:jingxian 欄目:編程語言

一、首先說一下JDK中的動態代理:

JDK中的動態代理是通過反射類Proxy以及InvocationHandler回調接口實現的

但是,JDK中所要進行動態代理的類必須要實現一個接口,也就是說只能對該類所實現接口中定義的方法進行代理,這在實際編程中具有一定的局限性,而且使用反射的效率也并不是很高。

二、使用CGLib實現:

使用CGLib實現動態代理,完全不受代理類必須實現接口的限制,而且CGLib底層采用ASM字節碼生成框架,使用字節碼技術生成代理類,比使用Java反射效率要高。唯一需要注意的是,CGLib不能對聲明為final的方法進行代理,因為CGLib原理是動態生成被代理類的子類。

下面,將通過一個實例介紹使用CGLib實現動態代理。

1、被代理類:

首先,定義一個類,該類沒有實現任何接口,包含兩個方法。

public class ConcreteClassNoInterface { 
 public String getConcreteMethodA(String str){ 
  System.out.println("ConcreteMethod A ... "+str); 
  return str; 
 } 
 public int getConcreteMethodB(int n){ 
  System.out.println("ConcreteMethod B ... "+n); 
  return n+10; 
 } 
}

2、攔截器:

定義一個攔截器。在調用目標方法時,CGLib會回調MethodInterceptor接口方法攔截,來實現你自己的代理邏輯,類似于JDK中的InvocationHandler接口。

public class ConcreteClassInterceptor implements MethodInterceptor{ 
 public Object intercept(Object obj, Method method, Object[] arg, MethodProxy proxy) throws Throwable { 
  System.out.println("Before:"+method); 
  Object object=proxy.invokeSuper(obj, arg); 
  System.out.println("After:"+method); 
  return object; 
 } 
} 

參數:Object為由CGLib動態生成的代理類實例,Method為上文中實體類所調用的被代理的方法引用,Object[]為參數值列表,MethodProxy為生成的代理類對方法的代理引用。

返回:從代理實例的方法調用返回的值。

其中,proxy.invokeSuper(obj,arg):

調用代理類實例上的proxy方法的父類方法(即實體類ConcreteClassNoInterface中對應的方法)

在這個示例中,只在調用被代理類方法前后各打印了一句話,當然實際編程中可以是其它復雜邏輯。

3、生成動態代理類:

Enhancer enhancer=new Enhancer(); 
enhancer.setSuperclass(ConcreteClassNoInterface.class); 
enhancer.setCallback(new ConcreteClassInterceptor()); 
ConcreteClassNoInterface ccni=(ConcreteClassNoInterface)enhancer.create(); 

這里Enhancer類是CGLib中的一個字節碼增強器,它可以方便的對你想要處理的類進行擴展,以后會經常看到它。

首先將被代理類ConcreteClassNoInterface設置成父類,然后設置攔截器ConcreteClassInterceptor,最后執行enhancer.create()動態生成一個代理類,并從Object強制轉型成父類型ConcreteClassNoInterface。

最后,在代理類上調用方法:

ccni.getConcreteMethodA("shensy"); 
ccni.getConcreteMethodB(0); 

查看控制臺輸出:

Before :public java.lang.String generic.cglib.proxy.ConcreteClassNoInterface.getConcreteMethodA(java.lang.String) 
ConcreteMethod A ... shensy 
After :public java.lang.String generic.cglib.proxy.ConcreteClassNoInterface.getConcreteMethodA(java.lang.String) 
Before :public int generic.cglib.proxy.ConcreteClassNoInterface.getConcreteMethodB(int) 
ConcreteMethod B ... 0 
After :public int generic.cglib.proxy.ConcreteClassNoInterface.getConcreteMethodB(int) 

可以看到,攔截器在調用被代理類方法前后都執行了print操作。

以上這篇Java CGLib動態代理機制(全面解析)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。

向AI問一下細節

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

AI

彭山县| 冕宁县| 兴宁市| 建水县| 连平县| 蒙自县| 大埔区| 山东| 大田县| 贡嘎县| 延川县| 昌平区| 山阴县| 贵港市| 东城区| 班玛县| 阜南县| 思南县| 淮北市| 凤翔县| 沙雅县| 蛟河市| 株洲县| 临高县| 云阳县| 泸州市| 富顺县| 岳阳县| 开封县| 荥阳市| 沂南县| 如皋市| 浮山县| 武川县| 南华县| 舟山市| 乌拉特前旗| 什邡市| 永顺县| 锡林郭勒盟| 阜新市|