程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JDK動態代理簡介

JDK動態代理簡介

編輯:關於JAVA

動態代理

代理模式是 Java 中的常用設計模式,代理類通過調用被代理類的相關方法,提供預處理、過濾、事後處理等服務,動態代理及通過反射機制動態實現代理機制。JDK 中的 java.lang.reflect.Proxy 類可以用來實現動態代理。

首先,准備一個簡單的接口和實現類

/**
 * 接口 IHello.java
 */
public interface IHello {
    void hello();
}
/**
 * 實現類 Hello.java
 */
public class Hello implements IHello {
    @Override
    public void hello() {
        System.out.println("我是Hello.");
    }
}

通過 Proxy 實現動態代理

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
    
import org.junit.Test;
    
public class HelloTest {
    @Test
    public void testProxy() throws Exception {
        final IHello hello = new Hello();
    
        /*
         * proxyHello    : 代理主題角色,代理類的實例 
         * IHello        : 抽象主題角色,代理類和被代理類都需要實現的接口,JDK中的動態代理必須針對接口
         * hello         : 真實主題角色,被代理類的實例
         */
        IHello proxyHello = (IHello) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
                new Class[] { IHello.class }, new InvocationHandler() {
    
                    /*
                     * proxy : 當前代理類的一個實例; 若調用proxy的非final方法,將造成無限循環調用
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
                        // 前期的業務邏輯操作
                        System.out.println("---開始");
    
                        // 調用被代理類的方法,傳入參數args,得到返回
                        Object object = method.invoke(hello, args);
    
                        // 後期的業務邏輯操作
                        System.out.println("---結束");
    
                        return object;
                    }
                });
    
        proxyHello.hello();
    }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved