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

一文了解Java動態(tài)代理的原理及實現(xiàn)

 更新時間:2022年07月06日 16:48:25   作者:遇安.112  
動態(tài)代理指的是,代理類和目標類的關系在程序運行的時候確定的,客戶通過代理類來調(diào)用目標對象的方法,是在程序運行時根據(jù)需要動態(tài)的創(chuàng)建目標類的代理對象。本文將通過案例詳細講解一下Java動態(tài)代理的原理及實現(xiàn),需要的可以參考一下

代理是指:某些場景下對象會找一個代理對象,來輔助自己完成一些工作,如明星的經(jīng)紀人、買房的人找房產(chǎn)中介等。

代理主要是對對象的行為額外做一些輔助操作。 

如何創(chuàng)建代理對象:

Java中代理的代表類是:Java.lang.reflect.Proxy

Proxy提供了一個靜態(tài)方法,用于為對象產(chǎn)生一個代理對象返回

主類:

public class Test {
    public static void main(String[] args) {
        //1、創(chuàng)建一個類,對象類必須實現(xiàn)接口
        star s=new star("小明");
        //為小明這個明星對象生成一個代理對象(經(jīng)紀人)
        skill s2=StarAgentProxy.getProxy(s);
        s2.sing();//走代理的
        s2.jump();
        
        //運行結(jié)果:
        //代理開始
        //小明開始唱歌
        //代理結(jié)束
        //代理開始
        //小明開始跳舞
        //代理結(jié)束
    }
}

明星類(對象類):

//明星類
public class star implements skill{
    private String name;
 
    public star(String name) {
        this.name = name;
    }
    //重寫方法
    public void jump(){
        System.out.println(name+"開始跳舞");
    }
    public void sing(){
        System.out.println(name+"開始唱歌");
    }
}

行為接口類:

//行為類
public interface skill {
    void jump();//跳舞
    void sing();//唱歌
}

代理類:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
 
//代理類
public class StarAgentProxy {
    //定義一個方法來返回一個明星對象的代理對象
    public static skill getProxy(star obj){
        //為小明這個對象生成一個代理對象
        /*
          public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces, 對象實現(xiàn)的接口列表
                                          InvocationHandler h)
         */
        return (skill) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("代理開始");
                        //真正的讓小明去唱歌、跳舞
                        //method==>正在調(diào)用的方法對象, args==>代表這個方法的參數(shù)
                        Object rs=method.invoke(obj,args);
                        System.out.println("代理結(jié)束");
                        return rs;
                    }
                });
    }
}

實現(xiàn)步驟:

1、必須存在接口

2、被代理的對象需要實現(xiàn)接口

3、使用Proxy類提供的方法得到對象的代理對象

通過代理對象調(diào)用方法,執(zhí)行流程是什么樣的?

1、先走向代理

2、代理可以為方法額外做一些輔助工作

3、開始真正觸發(fā)對象的方法的執(zhí)行

4、回到代理中,由代理負責返回結(jié)果給方法的調(diào)用者

優(yōu)化代碼的關鍵步驟:

1、必須有接口,實現(xiàn)類要實現(xiàn)接口(代理通常是基于接口實現(xiàn)的)

2、創(chuàng)建一個實現(xiàn)類的對象,該對象為業(yè)務對象,緊接著為業(yè)務對象做一個代理對象 

動態(tài)代理的優(yōu)點:

1、可以在不改變方法源碼的情況下,實現(xiàn)對方法功能的增強,提高了代碼的復用

2、簡化了編程工作、提高了開發(fā)效率,同時提高了軟件系統(tǒng)的可拓展性

3、可以為被代理對象的所有方法做代理

4、非常靈活,支持任意接口類型的實現(xiàn)類對象做代理,也可以直接為接口本身做代理

為任意接口類型的實現(xiàn)類對象做代理的框架(運行泛型)

    public static <T> T get(T obj){
        return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        return null;
                    }
                });
    }

到此這篇關于一文了解Java動態(tài)代理的原理及實現(xiàn)的文章就介紹到這了,更多相關Java動態(tài)代理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 淺談Mybatis SqlSession執(zhí)行流程

    淺談Mybatis SqlSession執(zhí)行流程

    本文主要介紹了淺談Mybatis SqlSession執(zhí)行流程,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2021-07-07
  • JAVA中的字符串常量池使用操作代碼

    JAVA中的字符串常量池使用操作代碼

    Java中的字符串常量池是Java堆中的一塊特殊存儲區(qū)域,用于存儲字符串。它的實現(xiàn)是為了提高字符串操作的性能并節(jié)省內(nèi)存,這篇文章主要介紹了JAVA中的字符串常量池,需要的朋友可以參考下
    2022-12-12
  • Springboot 整合 Dubbo/ZooKeeper 實現(xiàn) SOA 案例解析

    Springboot 整合 Dubbo/ZooKeeper 實現(xiàn) SOA 案例解析

    這篇文章主要介紹了Springboot 整合 Dubbo/ZooKeeper 詳解 SOA 案例,需要的朋友可以參考下
    2017-11-11
  • IDEA連接MySQL提示serverTimezone的問題及解決方法

    IDEA連接MySQL提示serverTimezone的問題及解決方法

    很多朋友私聊小編,使用IDEA軟件連接MySQL數(shù)據(jù)庫時總是提示Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.的錯誤,小編就不一一回復大家了,下面小編把我的解決方法分享到腳本之家平臺,需要的朋友參考下吧
    2021-05-05
  • java8新特性之stream流中reduce()求和知識總結(jié)

    java8新特性之stream流中reduce()求和知識總結(jié)

    今天帶大家回顧Java8的新特性,文中對stream流中reduce()求和的相關知識作了詳細的介紹,對正在學習java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • java&javascript自定義加密數(shù)據(jù)傳輸代碼示例

    java&javascript自定義加密數(shù)據(jù)傳輸代碼示例

    這篇文章主要介紹了java&javascript自定義加密數(shù)據(jù)傳輸代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • 淺談Java8 的foreach跳出循環(huán)break/return

    淺談Java8 的foreach跳出循環(huán)break/return

    這篇文章主要介紹了Java8 的foreach跳出循環(huán)break/return,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java的函數(shù)方法詳解(含漢諾塔問題)

    Java的函數(shù)方法詳解(含漢諾塔問題)

    漢諾塔問題是一個經(jīng)典的遞歸問題,下面這篇文章主要給大家介紹了關于Java函數(shù)方法(含漢諾塔問題)的相關資料,文中通過圖文以及代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • 一文帶你深入了解Java中延時任務的實現(xiàn)

    一文帶你深入了解Java中延時任務的實現(xiàn)

    延時任務相信大家都不陌生,在現(xiàn)實的業(yè)務中應用場景可以說是比比皆是。這篇文章主要為大家介紹幾種實現(xiàn)延時任務的辦法,感興趣的可以了解一下
    2022-11-11
  • Spring配置文件使用占位符配置方式

    Spring配置文件使用占位符配置方式

    這篇文章主要介紹了Spring配置文件使用占位符配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評論