1. 程式人生 > >JDK動態代理的一個最簡單的例項

JDK動態代理的一個最簡單的例項

JDK動態代理大家都知道的有spring aop,它的實現就是基於JDK的動態代理,它只能對實現了介面的類實現代理,在程式執行過程中,根據代理的介面來動態生成代理類,如果要使用類的代理,就得使用cglib,我們另一篇文章進行說明。下面直接看一個最簡單的例項程式碼 1:定義一個介面 public interface IUser { void addUser(); } 2:定義介面的實現 import com.common.service.IUser; public class UserImpl implements IUser { public void addUser() { // 這裡是程式碼邏輯,我們省略,只打印一句話,做為演示 System.out.print("------------add user success----------"); } } 3:實現程式碼類 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import com.common.service.IUser; import com.common.service.impl.UserImpl; public class MyInvocation implements InvocationHandler { private Object target; public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 加入該物件執行之前的程式碼邏輯,這裡我們只打印一句話,複雜的邏輯也是一樣加在這裡 System.out.print("物件執行之前的程式碼邏輯"); // 返回代理物件 Object resultObject = method.invoke(target, args); // 加入該物件執行之後的程式碼邏輯,這裡我們只打印一句話,複雜的邏輯也是一樣加在這裡 System.out.print("物件執行之後的程式碼邏輯"); return resultObject; } public MyInvocation(Object target) { this.target = target; } } 4:測試程式碼是否正常
// 測試方法,也可以寫在junit中 public static void main(String[] args) { // 得到代理物件 MyInvocation myInvocationHandler = new MyInvocation(new UserImpl()); IUser proxy = (IUser) Proxy.newProxyInstance(MyInvocation.class.getClassLoader(), new Class[] { IUser.class }, myInvocationHandler); // 呼叫方法 proxy.addUser(); } 5:檢視執行結果
物件執行之前的程式碼邏輯------------add user success----------物件執行之後的程式碼邏輯 發現在add方法執行前和執行後打印出來我們執行的程式碼。這只是一個最簡單的實現,類似helloworld,如果有興趣的話,可以再進行深入研究 。瞭解一個最簡單的實現後再去研究會很有幫助的。