欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java動態(tài)代理和cglib動態(tài)代理示例分享

 更新時間:2014年03月23日 11:34:16   作者:  
這篇文章主要介紹了java動態(tài)代理和cglib動態(tài)代理示例,JDK1.3之后,Java提供了動態(tài)代理的技術(shù),允許開發(fā)者在運行期間創(chuàng)建接口的代理實例,下面我們使用示例學習一下

java動態(tài)代理類可以分為兩種。

靜態(tài)代理:由程序員創(chuàng)建或特定工具自動生成源代碼,再對其編譯。在程序運行前,代理類的.class文件就已經(jīng)存在了。

動態(tài)代理:在程序運行時,運用反射機制動態(tài)創(chuàng)建而成。


一、首先我們進行java動態(tài)代理的演示。

現(xiàn)在我們有一個簡單的業(yè)務(wù)接口Saying,如下:

復制代碼 代碼如下:

package testAOP;
public interface Saying {
public void sayHello(String name);   
public void talking(String name);
}

一個簡單的實現(xiàn)類SayingImpl,如下:

復制代碼 代碼如下:

package testAOP;
public class SayingImpl implements Saying {
    @Override
    public void sayHello(String name) {
        // TODO Auto-generated method stub
        System.out.println(name + ":大家好??!");
    }
    @Override
    public void talking(String name) {
        // TODO Auto-generated method stub
        System.out.println(name + ":我的意思是,我們要努力建設(shè)和諧社會!");
    }
}

我們要實現(xiàn)的是,在sayHello和talking之前和之后分別動態(tài)植入處理。

JDK動態(tài)代理主要用到j(luò)ava.lang.reflect包中的兩個類:Proxy和InvocationHandler.

InvocationHandler是一個接口,通過實現(xiàn)該接口定義橫切邏輯,并通過反射機制調(diào)用目標類的代碼,動態(tài)的將橫切邏輯和業(yè)務(wù)邏輯編織在一起。

Proxy利用InvocationHandler動態(tài)創(chuàng)建一個符合某一接口的實例,生成目標類的代理對象。

如下,我們創(chuàng)建一個InvocationHandler實例:

復制代碼 代碼如下:

package testAOP;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class MyInvocationHandler implements InvocationHandler {

    private Object target;
    MyInvocationHandler(Object target){
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        //目標方法前執(zhí)行
        System.out.println("——————————————————————————");
        System.out.println("下一位請登臺發(fā)言!");
        //目標方法調(diào)用
        Object obj = method.invoke(target, args);
        //目標方法后執(zhí)行
        System.out.println("大家掌聲鼓勵!");
        return obj;
    }
}

下面是測試:

復制代碼 代碼如下:

package testAOP;
import java.lang.reflect.Proxy;
public class JDKProxyTest {

    public static void main(String[] args) {
        // 希望被代理的目標業(yè)務(wù)類
        Saying target = new SayingImpl();
        // 將目標類和橫切類編織在一起
        MyInvocationHandler handler = new MyInvocationHandler(target);
        // 創(chuàng)建代理實例
        Saying proxy = (Saying) Proxy.newProxyInstance(
                target.getClass().getClassLoader(),//目標類的類加載器
                target.getClass().getInterfaces(),//目標類的接口
                handler);//橫切類
        proxy.sayHello("小明");
        proxy.talking("小麗");
    }
}

運行情況如下:

復制代碼 代碼如下:

——————————————————————————
下一位請登臺發(fā)言!
小明:大家好??!
大家掌聲鼓勵!
——————————————————————————
下一位請登臺發(fā)言!
小麗:我的意思是,我們要努力建設(shè)和諧社會!
大家掌聲鼓勵!

使用JDK動態(tài)代理有一個很大的限制,就是它要求目標類必須實現(xiàn)了對應方法的接口,它只能為接口創(chuàng)建代理實例。我們在上文測試類中的Proxy的newProxyInstance方法中可以看到,該方法第二個參數(shù)便是目標類的接口。如果該類沒有實現(xiàn)接口,這就要靠cglib動態(tài)代理了。

CGLib采用非常底層的字節(jié)碼技術(shù),可以為一個類創(chuàng)建一個子類,并在子類中采用方法攔截的技術(shù)攔截所有父類方法的調(diào)用,并順勢植入橫切邏輯。

二、接下來我們進行cglib動態(tài)代理的演示。

首先我們需要導包,我用的包是cglib-nodep-2.1_3.jar。

我們首先創(chuàng)建一個代理創(chuàng)建器CglibProxy:

復制代碼 代碼如下:

package testAOP.cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CglibProxy implements MethodInterceptor{

    Enhancer enhancer = new Enhancer();
    public Object getProxy(Class clazz) {
        //設(shè)置需要創(chuàng)建的子類
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        //通過字節(jié)碼技術(shù)動態(tài)創(chuàng)建子類實例
        return enhancer.create();
    }
    @Override
    public Object intercept(Object obj, Method method, Object[] args,
            MethodProxy proxy) throws Throwable {
        // TODO Auto-generated method stub
        System.out.println("——————————————————————————");
        System.out.println("下一位請登臺發(fā)言!");
        //目標方法調(diào)用
        Object result = proxy.invokeSuper(obj, args);
        //目標方法后執(zhí)行
        System.out.println("大家掌聲鼓勵!");
        return result;
    }   
}

然后進行測試:

復制代碼 代碼如下:

package testAOP.cglib;
import testAOP.Saying;
import testAOP.SayingImpl;
public class CglibProxyTest {

    public static void main(String[] args) {
        CglibProxy proxy = new CglibProxy();
        //通過動態(tài)生成子類的方式創(chuàng)建代理類
        Saying target = (Saying) proxy.getProxy(SayingImpl.class);
        target.sayHello("小明");
        target.talking("小麗");
    }
}

結(jié)果與JDK動態(tài)代理沒有任何區(qū)別。

JDK動態(tài)代理和CGLib動態(tài)代理都是運行時增強,通過將橫切代碼植入代理類的方式增強。與此不同的是AspectJ,它能夠在通過特殊的編譯器在編譯時期將橫切代碼植入增強,這樣的增強處理在運行時候更有優(yōu)勢,因為JDK動態(tài)代理和CGLib動態(tài)代理每次運行都需要增強。

相關(guān)文章

  • Java實現(xiàn)消消樂中的消除功能

    Java實現(xiàn)消消樂中的消除功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)消消樂中的消除功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Spring實戰(zhàn)之方法級別緩存用法示例

    Spring實戰(zhàn)之方法級別緩存用法示例

    這篇文章主要介紹了Spring實戰(zhàn)之方法級別緩存用法,結(jié)合實例形式分析了spring方法級別緩存配置、屬性文件、領(lǐng)域模型及相關(guān)使用技巧,需要的朋友可以參考下
    2020-01-01
  • struts2框架的登錄制作圖文教程

    struts2框架的登錄制作圖文教程

    下面小編就為大家?guī)硪黄猻truts2框架的登錄制作圖文教程。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • 詳解java中反射機制(含數(shù)組參數(shù))

    詳解java中反射機制(含數(shù)組參數(shù))

    這篇文章主要介紹了詳解java中反射機制(含數(shù)組參數(shù))的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • Java集合List相關(guān)面試題整理大全

    Java集合List相關(guān)面試題整理大全

    這篇文章主要給大家介紹了關(guān)于Java集合List相關(guān)面試題整理的相關(guān)資料,下面將提供一些常見的Java集合類面試題及其解答,幫助讀者更好地準備面試,需要的朋友可以參考下
    2024-01-01
  • springboot集成dubbo注解版的示例代碼

    springboot集成dubbo注解版的示例代碼

    這篇文章主要介紹了springboot集成dubbo注解版的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • 基于spring-mvc.xml和application-context.xml的配置與深入理解

    基于spring-mvc.xml和application-context.xml的配置與深入理解

    這篇文章主要介紹了spring-mvc.xml和application-context.xml的配置與深入解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 一篇超詳細的SpringBoot整合MybatisPlus的文章

    一篇超詳細的SpringBoot整合MybatisPlus的文章

    這篇文章主要介紹了springboot整合Mybatis-plus的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-07-07
  • SpringBoot Session接口驗證實現(xiàn)流程詳解

    SpringBoot Session接口驗證實現(xiàn)流程詳解

    這篇文章主要介紹了SpringBoot+Session實現(xiàn)接口驗證(過濾器+攔截器)文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-09-09
  • Spark Streaming編程初級實踐詳解

    Spark Streaming編程初級實踐詳解

    這篇文章主要為大家介紹了Spark Streaming編程初級實踐詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04

最新評論