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

Java反射的應(yīng)用之動態(tài)代理深入理解

 更新時間:2021年09月13日 10:21:58   作者:威斯布魯克.猩猩  
這篇文章主要介紹了Java反射的應(yīng)用之動態(tài)代理深入理解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、代理模式的引入

靜態(tài)代理舉例
特點:代理類和被代理類在編譯期間,就確定下來了。

interface ClothFactory{
    void produceCloth();
}
//代理類
class ProxyClothFactory implements ClothFactory{
    private ClothFactory factory;//用被代理類對象進(jìn)行實例化
    public ProxyClothFactory(ClothFactory factory){
        this.factory = factory;
    }
    @Override
    public void produceCloth() {
        System.out.println("代理工廠做一些準(zhǔn)備工作");
        factory.produceCloth();
        System.out.println("代理工廠做一些后續(xù)的收尾工作");
    }
}
//被代理類
class NikeClothFactory implements ClothFactory{
 
    @Override
    public void produceCloth() {
        System.out.println("Nike工廠生產(chǎn)一批運動服");
    }
}
public class StaticProxyTest {
    public static void main(String[] args) {
        //創(chuàng)建被代理類的對象
        NikeClothFactory nike = new NikeClothFactory();
        //創(chuàng)建代理類的對象
        ProxyClothFactory proxyClothFactory = new ProxyClothFactory(nike);
        proxyClothFactory.produceCloth();
    }

二、動態(tài)代理

動態(tài)代理的舉例

interface Human{
    String getBelief();
    void eat(String food);
}
//被代理類
class SuperMan implements Human{
    @Override
    public String getBelief() {
        return "I believe I can fly!";
    }
 
    @Override
    public void eat(String food) {
        System.out.println("我喜歡吃" + food);
    }
}
class HumanUtil{
    public void method1(){
        System.out.println("===================通用方法一===============================");
    }
    public void method2(){
        System.out.println("===================通用方法二===============================");
    }
}
/*
要想實現(xiàn)動態(tài)代理,需要解決的問題?
問題一:如何根據(jù)加載到內(nèi)存中的被代理類,動態(tài)的創(chuàng)建一個代理類及其對象。
問題二:當(dāng)通過代理類的對象調(diào)用方法a時,如何動態(tài)的去調(diào)用被代理類中的同名方法a。
 */
class ProxyFactory{
    //調(diào)用此方法,返回一個代理類的對象。解決問題一
    public static Object getProxyInstance(Object obj){//obj:被代理類的對象
        MyInvocationHandler handler = new MyInvocationHandler();
        handler.bind(obj);
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),handler);
    }
}
class MyInvocationHandler implements InvocationHandler{
    private Object obj;//需要使用被代理類的對象進(jìn)行賦值
    public void bind(Object obj){
        this.obj = obj;
    }
    //當(dāng)我們通過代理類的對象,調(diào)用方法a時,就會自動的調(diào)用如下的方法:invoke()
    //將被代理類要執(zhí)行的方法a的功能就聲明在invoke()中
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 
        HumanUtil util = new HumanUtil();
        util.method1();
        //method:即為代理類對象調(diào)用的方法,此方法也就作為了被代理類對象要調(diào)用的方法
        //obj:被代理類的對象
        Object returnValue = method.invoke(obj,args);
 
        util.method2();
        //上述方法的返回值就作為當(dāng)前類中的invoke()的返回值。
        return returnValue;
    }
}
public class ProxyTest{
    public static void main(String[] args) {
        SuperMan superMan = new SuperMan();
        Human proxyInstance = (Human) ProxyFactory.getProxyInstance(superMan);
        //當(dāng)通過代理類對象調(diào)用方法時,會自動的調(diào)用被代理類中同名的方法
        String belief = proxyInstance.getBelief();
        System.out.println(belief);
        proxyInstance.eat("四川麻辣燙");
        System.out.println("************************************************");
        NikeClothFactory nikeClothFactory = new NikeClothFactory();
        ClothFactory proxyClothFactory = (ClothFactory) ProxyFactory.getProxyInstance(nikeClothFactory);
        proxyClothFactory.produceCloth();
    }

到此這篇關(guān)于Java反射的應(yīng)用之動態(tài)代理深入理解的文章就介紹到這了,更多相關(guān)Java動態(tài)代理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文帶你看懂SpringBoot中的全局配置文件

    一文帶你看懂SpringBoot中的全局配置文件

    這篇文章主要介紹了一文帶你看懂SpringBoot中的全局配置文件,全局配置文件能夠?qū)σ恍┠J(rèn)配置值進(jìn)行修改,Spring Boot使用一個application.properties或者application.yaml的文件作為全局配置文件,需要的朋友可以參考下
    2023-08-08
  • Java常見問題之javac Hello.java找不到文件的解決方法

    Java常見問題之javac Hello.java找不到文件的解決方法

    剛開始編寫java代碼時,肯定會遇到各種各樣的bug,當(dāng)然對于初學(xué)者這也是能理解的,下面這篇文章主要給大家介紹了關(guān)于Java常見問題之javac Hello.java找不到文件解決的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下。
    2018-01-01
  • Spring Aop之AspectJ注解配置實現(xiàn)日志管理的方法

    Spring Aop之AspectJ注解配置實現(xiàn)日志管理的方法

    下面小編就為大家分享一篇Spring Aop之AspectJ注解配置實現(xiàn)日志管理的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Java調(diào)用構(gòu)造函數(shù)和方法及使用詳解

    Java調(diào)用構(gòu)造函數(shù)和方法及使用詳解

    在Java編程中,構(gòu)造函數(shù)用于初始化新創(chuàng)建的對象,而方法則用于執(zhí)行對象的行為,構(gòu)造函數(shù)在使用new關(guān)鍵字創(chuàng)建類實例時自動調(diào)用,沒有返回類型,并且名稱與類名相同,本文通過示例詳細(xì)介紹了如何在Java中使用構(gòu)造函數(shù)和方法,感興趣的朋友一起看看吧
    2024-10-10
  • Java中List轉(zhuǎn)字符串的5種方法解析

    Java中List轉(zhuǎn)字符串的5種方法解析

    在Java中將一個List轉(zhuǎn)換為字符串有多種方法,下面這篇文章主要給大家介紹了關(guān)于Java中List轉(zhuǎn)字符串的5種方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Java實現(xiàn)堆排序(大根堆)的示例代碼

    Java實現(xiàn)堆排序(大根堆)的示例代碼

    這篇文章主要介紹了Java實現(xiàn)堆排序(大根堆)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • 阿里云發(fā)布 Spring Boot 新腳手架工程

    阿里云發(fā)布 Spring Boot 新腳手架工程

    這篇文章主要介紹了阿里云發(fā)布 Spring Boot 新腳手架的相關(guān)資料,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,可以參考下
    2020-04-04
  • java學(xué)生管理系統(tǒng)界面簡單實現(xiàn)(全)

    java學(xué)生管理系統(tǒng)界面簡單實現(xiàn)(全)

    這篇文章主要為大家詳細(xì)介紹了java學(xué)生管理系統(tǒng)界面的簡單實現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • SpringBoot項目中只執(zhí)行一次的任務(wù)寫法實現(xiàn)

    SpringBoot項目中只執(zhí)行一次的任務(wù)寫法實現(xiàn)

    有時候我們需要進(jìn)行初始化工作,就說明只要進(jìn)行一次的工作,本文主要介紹了SpringBoot項目中只執(zhí)行一次的任務(wù)寫法實現(xiàn),感興趣的可以了解一下
    2023-12-12
  • Java實現(xiàn)MD5加密的方法

    Java實現(xiàn)MD5加密的方法

    這篇文章主要介紹了Java實現(xiàn)MD5加密的方法,實例分析了基于java實現(xiàn)md5加密的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07

最新評論