国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 Java Java入門 java代理模式介紹

java代理模式介紹

Jan 27, 2021 am 09:50 AM
java 代理模式

java代理模式介紹

我們先來介紹下什麼是代理。

(學(xué)習(xí)影片分享:java影片教學(xué)

代理程式是一種設(shè)計模式,它的核心思想,是將對目標(biāo)的存取轉(zhuǎn)移到代理物件上。這樣做的好處就是,目標(biāo)物件在不改變程式碼的情況下,可以透過代理物件加上一些額外的功能。這是一種程式設(shè)計思想,在不改變原有程式碼的情況下,透過代理程式增加一些擴(kuò)充功能。

代理程式如圖所示,使用者存取代理對象,代理對象透過存取目標(biāo)對象,來達(dá)到使用者存取目標(biāo)對象的目的,

java代理模式介紹

##代理程式模式包含三個角色:

ISubject:介面對象,該介面是對象和它的代理共用的介面。

TargetSubject:目標(biāo)對象,是實作抽象主題介面的類別。

Proxy:代理角色,內(nèi)部含有對目標(biāo)物件TargetSubject的引用,因此可以操作真實物件。代理物件提供與目標(biāo)物件相同的接口,以便在任何時刻都能取代目標(biāo)物件。同時,代理物件可以在執(zhí)行目標(biāo)物件操作時,附加其他的操作,相當(dāng)於對真實物件進(jìn)行封裝。

常見的代理模式分為靜態(tài)代理和動態(tài)代理,動態(tài)代理在Java中的實作分為JDK動態(tài)代理和cglib代理。

靜態(tài)代理

在之前已經(jīng)說過,在代理模式中有三個角色,一是目標(biāo)接口,二是目標(biāo)對象,三是代理對象。

現(xiàn)在以具體程式碼來實現(xiàn),首先是目標(biāo)接口如下:

 public interface IBlogService {

    void writeBlog();
}

目標(biāo)對象實現(xiàn)了目標(biāo)接口,程式碼如下:

public class BlogService implements IBlogService {

    @Override
    public void writeBlog() {
        System.out.println("i'm writing...");
    }
}

靜態(tài)代理對象,透過建構(gòu)方法獲取到目標(biāo)對象,並實現(xiàn)了目標(biāo)接口,在目標(biāo)接口的方法裡調(diào)用了目標(biāo)對象的方法,代碼如下:

public class BlogStaticProxy implements IBlogService{
    private IBlogService blogService;

    public BlogStaticProxy(IBlogService blogService) {
        this.blogService = blogService;
    }

    @Override
    public void writeBlog() {
        System.out.println("start writing...");
        blogService.writeBlog();
        System.out.println("end writing...");
    }
}

靜態(tài)代理對象,通過構(gòu)造方法獲取到目標(biāo)對象,並實現(xiàn)了目標(biāo)接口,在目標(biāo)接口的方法裡呼叫了目標(biāo)對象的方法,代碼如下:

public class BlogStaticProxy implements IBlogService{
    private IBlogService blogService;

    public BlogStaticProxy(IBlogService blogService) {
        this.blogService = blogService;
    }

    @Override
    public void writeBlog() {
        System.out.println("start writing...");
        blogService.writeBlog();
        System.out.println("end writing...");
    }
}

測試:

public class TestStaticProxy {

    public static void main(String[] args) {
        IBlogService target = new BlogService();
        BlogStaticProxy proxy = new BlogStaticProxy(target);
        proxy.write();
    }
}
start writing…
i’m writing…
end writing…

靜態(tài)代理,在不修改目標(biāo)對象的情況下,可以通過代理對象做額外的擴(kuò)充功能。但靜態(tài)方法不是很靈活,如果目標(biāo)介面的程式碼修改,目標(biāo)物件和代理物件都需要修改。

動態(tài)代理在一定程度上避免這種情況,動態(tài)代理不需要代理對象實現(xiàn)目標(biāo)接口,並且上在java 虛擬機(jī)的內(nèi)存中動態(tài)的生成代理對象

Jdk動態(tài)對象

Jdk的動態(tài)代理由Proxy這個類別來生成,它有三個參數(shù):

ClassLoader loader,:指定目前目標(biāo)物件使用類別載入器,取得載入器的方法是固定的

Class[] interfaces,:目標(biāo)物件實現(xiàn)的介面的類型,使用泛型方式確認(rèn)類型

#InvocationHandler h:事件處理,執(zhí)行目標(biāo)物件的方法時,會觸發(fā)事件處理器的方法,會把目前執(zhí)行目標(biāo)物件的方法作為參數(shù)傳入

 public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h)
        throws IllegalArgumentException
    {

    }

Jdk的動態(tài)代理程式碼如下:

 public class JdkBlogProxyFactory {

    private Object target;

    public JdkBlogProxyFactory(Object target) {
        this.target = target;
    }

    public Object newInstance() {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),
                (proxy, method, args) -> {
                    System.out.println("start writing");
                    Object o = method.invoke(target, args);
                    System.out.println("end writing");
                    return o;
                });
    }
}

測試類別:

public class TestJdkProxy {
    public static void main(String[] args) {

        IBlogService target = new BlogService();

        System.out.println(target.getClass());

        // 給目標(biāo)對象,創(chuàng)建代理對象
        IBlogService proxy = (IBlogService) new JdkBlogProxyFactory(target).newInstance();
        // class $Proxy0   內(nèi)存中動態(tài)生成的代理對象
        System.out.println(proxy.getClass());

        // 執(zhí)行方法   【代理對象】
        proxy.writeBlog();
    }
}

控制臺列印如下:

class com.forezp.proxy.BlogService
class com.sun.proxy.$Proxy0
start writing
i&#39;m writing...
end writing

CGLib動態(tài)代理

CGLib採用了非常底層的字節(jié)碼技術(shù),其原理是透過字節(jié)碼技術(shù)為一個類別建立子類,並在子類中採用方法攔截的技術(shù)攔截所有父類別方法的調(diào)用,順勢織入橫切邏輯。

CglibBlogFactory代理工廠類別如下:

public class CglibBlogFactory implements MethodInterceptor {

    private Object target;

    public CglibBlogFactory(Object target) {
        this.target = target;
    }

    //給目標(biāo)對象創(chuàng)建一個代理對象
    public Object getProxyInstance() {
        //1.工具類
        Enhancer en = new Enhancer();
        //2.設(shè)置父類
        en.setSuperclass(target.getClass());
        //3.設(shè)置回調(diào)函數(shù)
        en.setCallback(this);
        //4.創(chuàng)建子類(代理對象)
        return en.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("start writing...");
        //執(zhí)行目標(biāo)對象的方法
        Object returnValue = method.invoke(target, objects);
        System.out.println("end writing...");
        return returnValue;
    }
}

測試類別:

public class TestCglib {

    public static void main(String[] args) {
        IBlogService target = new BlogService();
        //代理對象
        IBlogService proxy = (IBlogService) new CglibBlogFactory(target).getProxyInstance();
        //執(zhí)行代理對象的方法
        proxy.writeBlog();
    }
}

運(yùn)行程序,控制臺列?。?p>
start writing...
i&#39;m writing...
end writing...

相關(guān)推薦:

java入門教學(xué)

以上是java代理模式介紹的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1600
29
PHP教程
1502
276
如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務(wù),必須先關(guān)閉自動提交模式,再執(zhí)行多個操作,最後根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開始事務(wù);2.執(zhí)行多個SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時應(yīng)使用try-with-resources管理資源,妥善處理異常並關(guān)閉連接,避免連接洩漏;此外建議使用連接池、設(shè)置保存點實現(xiàn)部分回滾,並保持事務(wù)盡可能短以提升性能。

了解Java虛擬機(jī)(JVM)內(nèi)部 了解Java虛擬機(jī)(JVM)內(nèi)部 Aug 01, 2025 am 06:31 AM

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa

如何使用Java的日曆? 如何使用Java的日曆? Aug 02, 2025 am 02:38 AM

使用java.time包中的類替代舊的Date和Calendar類;2.通過LocalDate、LocalDateTime和LocalTime獲取當(dāng)前日期時間;3.使用of()方法創(chuàng)建特定日期時間;4.利用plus/minus方法不可變地增減時間;5.使用ZonedDateTime和ZoneId處理時區(qū);6.通過DateTimeFormatter格式化和解析日期字符串;7.必要時通過Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應(yīng)優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

垃圾收集如何在Java工作? 垃圾收集如何在Java工作? Aug 02, 2025 pm 01:55 PM

Java的垃圾回收(GC)是自動管理內(nèi)存的機(jī)制,通過回收不可達(dá)對象釋放堆內(nèi)存,減少內(nèi)存洩漏風(fēng)險。 1.GC從根對象(如棧變量、活動線程、靜態(tài)字段等)出發(fā)判斷對象可達(dá)性,無法到達(dá)的對像被標(biāo)記為垃圾。 2.基於標(biāo)記-清除算法,標(biāo)記所有可達(dá)對象,清除未標(biāo)記對象。 3.採用分代收集策略:新生代(Eden、S0、S1)頻繁執(zhí)行MinorGC;老年代執(zhí)行較少但耗時較長的MajorGC;Metaspace存儲類元數(shù)據(jù)。 4.JVM提供多種GC器:SerialGC適用於小型應(yīng)用;ParallelGC提升吞吐量;CMS降

了解網(wǎng)絡(luò)端口和防火牆 了解網(wǎng)絡(luò)端口和防火牆 Aug 01, 2025 am 06:40 AM

NetworkPortSandFireWallsworkTogetHertoEnableCommunication whereSeringSecurity.1.NetWorkPortSareVirtualendPointSnumbered0-655 35,with-Well-with-Newonportslike80(HTTP),443(https),22(SSH)和25(smtp)sindiessingspefificservices.2.portsoperateervertcp(可靠,c

以身作則,解釋說明 以身作則,解釋說明 Aug 02, 2025 am 06:26 AM

defer用於在函數(shù)返回前執(zhí)行指定操作,如清理資源;參數(shù)在defer時立即求值,函數(shù)按後進(jìn)先出(LIFO)順序執(zhí)行;1.多個defer按聲明逆序執(zhí)行;2.常用於文件關(guān)閉等安全清理;3.可修改命名返回值;4.即使發(fā)生panic也會執(zhí)行,適合用於recover;5.避免在循環(huán)中濫用defer,防止資源洩漏;正確使用可提升代碼安全性和可讀性。

比較Java構(gòu)建工具:Maven vs. Gradle 比較Java構(gòu)建工具:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

Gradleisthebetterchoiceformostnewprojectsduetoitssuperiorflexibility,performance,andmoderntoolingsupport.1.Gradle’sGroovy/KotlinDSLismoreconciseandexpressivethanMaven’sverboseXML.2.GradleoutperformsMaveninbuildspeedwithincrementalcompilation,buildcac

See all articles