一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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

服務器之家 - 編程語言 - Java教程 - Java實現動態代理的實例代碼

Java實現動態代理的實例代碼

2022-01-21 11:17隨身電源 Java教程

代理模式是常用的java設計模式,他的特征是代理類與委托類有同樣的接口,代理類主要負責為委托類預處理消息、過濾消息、把消息轉發給委托類,以及事后處理消息等,這篇文章主要給大家介紹了關于Java實現動態代理的相關資料,需要

前言

動態代理在Java中有著廣泛的應用,比如Spring AOP、Hibernate數據查詢、測試框架的后端mock、RPC遠程調用、Java注解對象獲取、日志、用戶鑒權、全局性異常處理、性能監控,甚至事務處理等。

代理,指的是使用代理對象代替對其它對象的訪問,簡單點說,你求職時找的中介就是代理,那么在Java中,代理如何體現呢?

靜態代理

我們首先需要知道,何為靜態代理?靜態代理指的是在編譯期就對目標對象的方法進行增強,例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class TestDemo {
 
    interface EmailService {
        void sendEmail(String emailContent);
    }
 
    static class EmailServiceImpl implements EmailService{
 
        @Override
        public void sendEmail(String emailContent) {
            System.out.println("發送了一封郵件,內容為:" + emailContent);
        }
    }
 
    public static void main(String[] args) {
        EmailService emailService = new EmailServiceImpl();
        emailService.sendEmail("hello");
    }
}

現在若是想在發送郵件之前獲取一下當前的時間,則可以使用代理類對發郵件的方法進行增強:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class TestDemo {
 
    interface EmailService {
        void sendEmail(String emailContent);
    }
 
    static class EmailServiceImpl implements EmailService{
 
        @Override
        public void sendEmail(String emailContent) {
            System.out.println("發送了一封郵件,內容為:" + emailContent);
        }
    }
 
    static class EmailProxy implements EmailService{
 
        private final EmailService emailService;
 
        public EmailProxy(EmailService emailService) {
            this.emailService = emailService;
        }
 
        @Override
        public void sendEmail(String emailContent) {
            System.out.println(LocalDateTime.now());
            emailService.sendEmail(emailContent);
        }
    }
 
    public static void main(String[] args) {
        EmailService emailProxy = new EmailProxy(new EmailServiceImpl());
        emailProxy.sendEmail("hello");
    }
}

靜態代理的缺點非常明顯,編寫麻煩,且可擴展性不強,而動態代理的出現,將徹底解決這些問題。

動態代理

動態代理與靜態代理恰恰相反,動態代理是在運行期對目標對象的某個方法進行增強,比如仍然是發郵件的服務,使用動態代理,即可這樣實現:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class TestDemo {
 
    interface EmailService {
        void sendEmail(String emailContent);
    }
 
    static class EmailServiceImpl implements EmailService {
 
        @Override
        public void sendEmail(String emailContent) {
            System.out.println("發送了一封郵件,內容為:" + emailContent);
        }
    }
 
    public static void main(String[] args) {
        EmailService emailService = new EmailServiceImpl();
        EmailService emailProxy = (EmailService) Proxy.newProxyInstance(EmailServiceImpl.class.getClassLoader(), EmailServiceImpl.class.getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println(LocalDateTime.now());
                Object result = method.invoke(emailService, args);
                return result;
            }
        });
        emailProxy.sendEmail("hello");
    }
}

使用JDK提供的Proxy和InvocationHandler類能夠輕松實現動態代理,但這種方式也是有局限性的,就是被增強的類必須實現了接口,因為Proxy的參數中需要接收類的接口信息。

CGLib實現動態代理

CGLib的出現,打破了這一僵局,使用CGLib,能夠增強任意的對象方法,即使你沒有實現任何接口,因為它是通過繼承的方式進行增強的。

下面就來演示一下如何使用CGLib,首先引入依賴:

?
1
2
3
4
5
<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.3.0</version>
</dependency>

實現如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class TestDemo {
 
    static class EmailServiceImpl {
        public void sendEmail(String emailContent) {
            System.out.println("發送了一封郵件,內容為:" + emailContent);
        }
    }
 
    public static void main(String[] args) {
        EmailServiceImpl emailService = new EmailServiceImpl();
        EmailServiceImpl emailProxy = (EmailServiceImpl) Enhancer.create(emailService.getClass(), new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                System.out.println(LocalDateTime.now());
                Object obj = methodProxy.invokeSuper(o, args);
                return obj;
            }
        });
        emailProxy.sendEmail("hello");
    }
}

它的寫法與JDK提供的方式類似,通過Enhancer類的create()方法即可增強一個對象,并傳入對象的Class對象和一個MethodInterceptor接口的實現類,并在intercept()方法中對原方法進行增強。

總結

到此這篇關于Java實現動態代理的文章就介紹到這了,更多相關Java實現動態代理內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://juejin.cn/post/7012608239816671269

延伸 · 閱讀

精彩推薦
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
主站蜘蛛池模板: 男人天堂资源 | 欧美老骚 | 18捆绑调教在线高清 | 四虎影视在线观看2413 | 亚洲国产精品无圣光一区二区 | 91久久国产| 欧美一级在线全免费 | 美国video| 日出水了特别黄的视频 | 国产精品乱码高清在线观看 | 欧美巨胸 | 鬼畜重口高h合集长短篇 | 国产欧美日韩在线不卡第一页 | 欧美成人aletta ocean | 色偷偷亚洲男人 | 国内精品九一在线播放 | 人人揉人人爽五月天视频 | 99国产情在线视频 | 91久久综合九色综合欧美98 | 91精品国产91久久久久 | 99精品热 | 亚洲sss视频 | 欧美高清国产 | 午夜欧美精品久久久久久久久 | 久久九九久精品国产尤物 | 九九久久国产精品大片 | 亚洲入口 | 毛片应用 | 天堂在线看 | 超碰成人在线播放 | 192.168.191| 韩国男女做性全过程视频 | 涩涩屋在线播放 | 99视频全部看免费观 | 国产一级视频在线观看 | 日本午夜影院 | 久久视频这只精品99re6 | 热门小说同人h改编h | 国产午夜精品福利 | 国产成人亚洲精品一区二区在线看 | youwu在线影院|