首頁  >  文章  >  Java  >  Java 匿名內部類別如何實作動態代理?

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

WBOY
WBOY原創
2024-04-30 17:36:01912瀏覽

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