日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java使用Proxy和CGLib实现动态代理

發布時間:2024/10/8 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java使用Proxy和CGLib实现动态代理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ?在java中對一個方法進行改造有幾種方法可以實現,分別是最常用的繼承(extends)、動態代理和裝飾者模式。繼承是最簡單也是用的最多的方法,但是還是有一些場景不適用,這個時候就可能會用到動態代理。使用動態代理可以通過兩種方式實現:1、使用JDK自帶的Proxy實現代理。2、使用第三方類庫CGLib實現動態代理。

一、使用Proxy實現動態代理必須是需要代理的類實現了某一個接口,這樣才能實現代理

下面介紹兩種使用動態代理的方式實現的案例。

首先準備一個接口和兩個實現類對這兩個實現類分別進行改造

?

package com.zjp.dao;/*** 定義一個接口* @author zhujunpeng**/ public interface UserDao {public void addUser(); } package com.zjp.dao.impl;import com.zjp.dao.UserDao;public class UserDaoImpl implements UserDao{@Overridepublic void addUser() {System.out.println("添加用戶邏輯。。。。");}}

定義一個切點

package com.zjp.aspect;/*** 自定義切點* @author zhujunpeng**/ public class MyAspect {public void start(){System.out.println("start----");}public void end(){System.out.println("end----");} }

?

?

?

?

?

?

?

1、使用動態代理實現對一個方法進行改造

?

package com.zjp.proxy;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;import com.zjp.aspect.MyAspect; import com.zjp.dao.UserDao;/*** 動態代理的實現* @author zhujunpeng**/ public class MyProxy implements InvocationHandler{// 需要代理的對象private UserDao userDao;/*** 創建代理方法* @param userDao* @return*/public Object createProxy(UserDao userDao){this.userDao = userDao;// 1、類型加載器ClassLoader classLoader = MyProxy.class.getClassLoader();// 2、被代理對象實現的接口Class<?>[] clazz = userDao.getClass().getInterfaces();// 3、使用代理類、進行增強,返回的是代理后的對象return Proxy.newProxyInstance(classLoader, clazz, this);}/*** 每個代理對象都會走這個方法*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 聲明切面MyAspect myAspect = new MyAspect();myAspect.start();Object object = method.invoke(userDao, args);myAspect.end();return object;}}

增加測試方法

package com.zjp;import com.zjp.dao.UserDao; import com.zjp.dao.impl.UserDaoImpl; import com.zjp.proxy.MyProxy;/*** 測試方法* @author zhujunpeng**/ public class JdkProxyTest {public static void main(String[] args) {// 創建代理對象MyProxy myProxy = new MyProxy();UserDao userDao = new UserDaoImpl();userDao.addUser();UserDao userDaoProxy = (UserDao) myProxy.createProxy(userDao);userDaoProxy.addUser();} }


最后得到的結果為:?

添加用戶邏輯。。。。 start---- 添加用戶邏輯。。。。 end----

?

二、使用CGlib實現動態代理

如果要對某一個類實現動態代理,但是該類并沒有實現某個接口,那使用CGlib就非常合適。主要代碼如下:

一個沒有實現接口的類:

public class PersonServerImpl {public void save() {System.out.println("我是save方法");}public String getPersonName() {System.out.println("我是getPersonName方法");return "XX";}public void update() {System.out.println("我是update方法");}}

使用CGLib進行代理

?

package com.zjp.proxy;import java.lang.reflect.Method;import com.zjp.aspect.MyAspect; import com.zjp.dao.impl.PersonServerImpl;import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy;/*** 使用cglib實現動態代理* * @author zhujunpeng**/ public class CglibProxyFactory implements MethodInterceptor {// 需要代理的對象private Object delegate;// 綁定對象,綁定的對象不是接口public Object createProxyInstance(Object delegate) {this.delegate = delegate;Enhancer enhancer = new Enhancer();enhancer.setSuperclass(this.delegate.getClass());enhancer.setCallback(this);return enhancer.create();}@Overridepublic Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {MyAspect aspect = new MyAspect();aspect.start();Object invoke = method.invoke(delegate, args);aspect.end();return invoke;}}

代理類搞定之后,進行測試:

?

?

@Testpublic void proxyTest2() {CglibProxyFactory factory = new CglibProxyFactory();PersonServerImpl personServer = new PersonServerImpl();PersonServerImpl personServerProxy = (PersonServerImpl) factory.createProxyInstance(personServer);personServerProxy.save();}


通過測試之后也能實現與Proxy同樣的功能。

?

總結

以上是生活随笔為你收集整理的Java使用Proxy和CGLib实现动态代理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天天爽av| av成人免费| 欧美精品一区二区三区在线播放 | 欧美久久久久久久久久久久久久 | 国产精品免费一区二区三区 | 日韩国产在线一区 | 最新天堂av | 国产性猛交╳xxx乱大交 | 在线亚洲免费 | 91观看视频 | 欧美三区在线 | 国产成人精品免费在线观看 | 精品国产成人 | www.自拍偷拍 | 色女孩综合网 | 911国产| 人妻射精一区二区 | 九九九视频在线观看 | 嫩草视频在线观看免费 | 日韩成人av在线 | 蜜臀国产AV天堂久久无码蜜臀 | 免费簧片在线观看 | 国产成人一区二区三区小说 | 青青草91久久久久久久久 | ,午夜性刺激免费看视频 | 免费av免费看 | 蜜臀av88| 天天激情 | 不用播放器av | 丰满人妻一区二区三区53号 | av首页在线观看 | 亚洲av成人精品午夜一区二区 | 舔花蒂| 亚洲熟女乱色综合亚洲av | 福利91| 一二三不卡 | 青青草操 | 一级片黑人 | 麻豆激情网 | 国产理论片在线观看 | 青青伊人精品 | 日本人体视频 | 人妻无码久久一区二区三区免费 | h网站免费在线观看 | 精品小视频 | 色草在线 | 亚洲综合在线一区二区 | 中文字幕日韩亚洲 | 69久久| 天天摸天天做天天爽 | 成人av播放| 性――交――性――乱 | 亚洲第一天堂网 | 国内自拍区 | 国产精品午夜福利 | 国产3p精品一区 | 国产小视频在线播放 | 人人干人人干人人干 | 日韩一二三区在线观看 | 免费一区| 一区二区精品在线 | 成人免费在线播放 | 成人18在线| 欧美日韩中文字幕在线观看 | 在线亚洲欧美 | 亚州男人天堂 | 日韩av一| 欧美a网站 | 久久精品在线免费观看 | 国产在线一区二区三区四区 | 欧美日韩少妇 | 鬼灭之刃柱训练篇在线观看 | 久久成年视频 | 冲田杏梨在线 | 精品久久伊人 | 四虎影视网 | 97国产| 东方影库av| www狠狠| 超碰人人超 | 久久中文字幕电影 | 秋霞在线视频 | 日韩精品在线免费看 | 成人精品免费 | 天天插天天操天天干 | 爱色成人网| 亚洲欧美激情另类 | 美日韩一区二区 | 国产www性 | 黄色片免费网站 | 特级毛片a | 亚洲 另类 春色 国产 | 尤物视频在线观看国产性感 | 久久久久久91亚洲精品中文字幕 | 玖草在线观看 | 91在线无精精品白丝 | 国产精品一卡二卡 | 亚洲天堂中文字幕在线观看 | 就要爱爱tv |