激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java CGLib動態代理機制(全面解析)

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

2020-12-10 14:15Java教程網 Java教程

下面小編就為大家帶來一篇Java CGLib動態代理機制(全面解析)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

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

二、使用CGLib實現:

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

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

1、被代理類:

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

?
1
2
3
4
5
6
7
8
9
10
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接口。

?
1
2
3
4
5
6
7
8
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、生成動態代理類:

?
1
2
3
4
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。

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

?
1
2
ccni.getConcreteMethodA("shensy");
ccni.getConcreteMethodB(0);

查看控制臺輸出:

?
1
2
3
4
5
6
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動態代理機制(全面解析)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99久久久国产精品露出 | 狠狠操你| 史上最强炼体老祖动漫在线观看 | 国产精选在线 | 亚洲射逼| 国产资源视频在线观看 | 国产精品成人一区二区三区电影毛片 | 国产成人在线免费观看视频 | 黑色丝袜美美女被躁视频 | xnxx 日本19| www.精品一区 | 激情小说色 | 亚洲一区二区在线视频 | 视频国产一区二区 | 成人黄色网战 | 中国大陆高清aⅴ毛片 | 一本色道久久综合亚洲精品图片 | 日本免费一区二区三区四区 | 日本一级黄色毛片 | 久久精品亚洲国产奇米99 | 久久精品观看 | 91美女啪啪 | 一级片免费| 欧美成人精品欧美一级乱黄 | 午夜精品久久久久久毛片 | 媚药按摩痉挛w中文字幕 | 午夜男人在线观看 | 免费观看欧美一级片 | 国产在线a | 久久精品美乳 | 欧美人与禽性xxxxx杂性 | 精品久久久久久久久久久下田 | 免费看成人av| 精品亚洲一区二区三区 | 在线无码 | 成人性视频免费网站下载软件 | 主播粉嫩国产在线精品 | 日韩电影一区二区三区 | 亚洲成人第一区 | 粉嫩av一区二区三区四区在线观看 | 九色一区二区 |