搜尋
首頁Javajava教程Java 匿名內部類別如何實作動態代理?

Java 中可以使用匿名內部類別實作動態代理,透過以下步驟:1. 定義介面;2. 建立實作 InvocationHandler 介面的匿名內部類別;3. 使用 Proxy 類別建立代理物件;4. 呼叫代理方法。實戰中,動態代理可以增強或攔截方法調用,如記錄方法執行時間。

Java 匿名内部类如何实现动态代理?

Java 匿名內部類別如何實作動態代理

動態代理程式是一種用於在執行時間建立物件代理的技術,允許在不修改目標類別程式碼的情況下增強或攔截物件的呼叫。 Java 中可以使用匿名內部類別來實作動態代理。

1. 定義介面

首先,定義一個介面來表示目標物件的方法:

interface Target {
    void doSomething();
}

2. 建立匿名內部類

要建立動態代理,可以使用匿名內部類別實作InvocationHandler# 介面:

InvocationHandler handler = new InvocationHandler() {
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 增强或拦截方法调用
        return 1;
    }
};

3. 建立代理物件

#接下來,使用Proxy 類別建立代理物件:

Target proxy = (Target) Proxy.newProxyInstance(Target.class.getClassLoader(),
        new Class[]{Target.class}, handler);

#4. 呼叫代理方法

##現在可以呼叫代理物件上的方法,從而觸發動態代理行為:

proxy.doSomething(); // 调用代理方法

實戰案例

#以下是使用匿名內部類別實作動態代理的簡單範例:

public class Main {
    public static void main(String[] args) {
        Target target = new TargetImpl();
        InvocationHandler handler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                // 增强方法调用
                long startTime = System.nanoTime();
                Object result = method.invoke(target, args);
                long endTime = System.nanoTime();
                System.out.println("方法执行时间:" + (endTime - startTime) + " 纳秒");
                return result;
            }
        };
        Target proxy = (Target) Proxy.newProxyInstance(Target.class.getClassLoader(),
                new Class[]{Target.class}, handler);
        proxy.doSomething();
    }
}

interface Target {
    void doSomething();
}

class TargetImpl implements Target {
    @Override
    public void doSomething() {
        System.out.println("原始方法执行");
    }
}

#在此範例中,動態代理充當

Target 介面的代理,在呼叫原始方法之前和之後,它執行計時增強。

以上是Java 匿名內部類別如何實作動態代理?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Spring框架中SerializableTypeWrapper類:為什麼需要包裝Type對像以保證可序列化?Spring框架中SerializableTypeWrapper類:為什麼需要包裝Type對像以保證可序列化?Apr 19, 2025 pm 03:12 PM

Spring框架中SerializableTypeWrapper類的作用在Spring框架的ResolvableType類中,我們常常會看到SerializableTypeWrapper的身影。 ...

在Spring Retry中如何確保@Retryable註解的監聽器只在指定時被調用?在Spring Retry中如何確保@Retryable註解的監聽器只在指定時被調用?Apr 19, 2025 pm 03:09 PM

在SpringRetry中如何正確配置@Retryable註解的監聽器?在使用Spring...

如何在Spring WebFlux中實現從serverB到serverC的容災重試機制?如何在Spring WebFlux中實現從serverB到serverC的容災重試機制?Apr 19, 2025 pm 03:06 PM

使用SpringWebFlux實現LLMGateway的容災重試機制在構建一個LLMgateway時,常常需要使用Spring...

曲線積分變量替換:如何將$\int_0^1 \frac{y^2}{\sqrt{1-y^2}}dy$轉化為$\int_0^{\frac{\pi}{2}}\sin^2tdt$?曲線積分變量替換:如何將$\int_0^1 \frac{y^2}{\sqrt{1-y^2}}dy$轉化為$\int_0^{\frac{\pi}{2}}\sin^2tdt$?Apr 19, 2025 pm 03:03 PM

關於曲線積分中變量替換的疑問本文將針對一個曲線積分計算中變量替換的步驟進行詳細解釋。提問者在計算一...

微信小程序申請:流程、費用及與服務號的關係詳解?微信小程序申請:流程、費用及與服務號的關係詳解?Apr 19, 2025 pm 03:00 PM

微信小程序申請流程及費用詳解朋友委託開發微信小程序商城,在申請過程中遇到一些關於費用和流程的問題,...

Java緩存數據丟失:為何從緩存中無法獲取數據?Java緩存數據丟失:為何從緩存中無法獲取數據?Apr 19, 2025 pm 02:57 PM

Java緩存數據無法獲取的原因分析及優化方案在Java項目中,將大量數據緩存到內存中以便快速訪問是一個常見的�...

想成為更優秀的Java開發者,深入研究JVM的哪些方面最值得投入?
或
Java進階:深入研究JVM,哪些核心機制最值得探索?想成為更優秀的Java開發者,深入研究JVM的哪些方面最值得投入? 或 Java進階:深入研究JVM,哪些核心機制最值得探索?Apr 19, 2025 pm 02:54 PM

深入Java:值得探索的虛擬機世界很多Java開發者在掌握了基礎語法和常用框架後,都希望進一步提升自己的技術�...

使用EasyExcel填充Excel模板時,如何解決合併單元格的數據覆蓋和样式丟失問題?使用EasyExcel填充Excel模板時,如何解決合併單元格的數據覆蓋和样式丟失問題?Apr 19, 2025 pm 02:51 PM

EasyExcel模板填充合併單元格時的常見問題在使用EasyExcel進行Excel...

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。