JDK動態代理的一個最簡單的例項
阿新 • • 發佈:2019-01-24
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,如果有興趣的話,可以再進行深入研究 。瞭解一個最簡單的實現後再去研究會很有幫助的。