JDK 動態代理的簡單理解


動態代理

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

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

1 /**
2  * 接口 IHello.java
3  */
4 public interface IHello {
5     void hello();
6 }
1 /**
2  * 實現類 Hello.java
3  */
4 public class Hello implements IHello {
5     @Override
6     public void hello() {
7         System.out.println("我是Hello.");
8     }
9 }

通過 Proxy 實現動態代理

 1 import java.lang.reflect.InvocationHandler;
 2 import java.lang.reflect.Method;
 3 import java.lang.reflect.Proxy;
 4 
 5 import org.junit.Test;
 6 
 7 public class HelloTest {
 8     @Test
 9     public void testProxy() throws Exception {
10         final IHello hello = new Hello();
11 
12         /*
13          * proxyHello    : 代理主題角色,代理類的實例 
14          * IHello        : 抽象主題角色,代理類和被代理類都需要實現的接口,JDK中的動態代理必須針對接口
15          * hello         : 真實主題角色,被代理類的實例
16          */
17         IHello proxyHello = (IHello) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
18                 new Class[] { IHello.class }, new InvocationHandler() {
19 
20                     /*
21                      * @param proxy : 當前代理類的一個實例; 若在invoke()方法中調用proxy的非final方法,將造成無限循環調用.
22                      */
23                     @Override
24                     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
25 
26                         // 前置的業務邏輯操作
27                         System.out.println("---開始");
28 
29                         // 調用被代理類的方法,傳入參數args,得到返回
30                         Object object = method.invoke(hello, args);
31 
32                         // 后置的業務邏輯操作
33                         System.out.println("---結束");
34 
35                         return object;
36                     }
37                 });
38 
39         proxyHello.hello();
40     }
41 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM