靜態(tài)代理
public interface ISinger {
2 void sing();
3 }
4
5 /**
6 * 目標(biāo)對(duì)象實(shí)現(xiàn)了某一接口
7 */
8 public class Singer implements ISinger{
9 public void sing(){
10 System.out.println("唱一首歌");
11 }
12 }
13
14 /**
15 * 代理對(duì)象和目標(biāo)對(duì)象實(shí)現(xiàn)相同的接口
16 */
17 public class SingerProxy implements ISinger{
18 // 接收目標(biāo)對(duì)象,以便調(diào)用sing方法
19 private ISinger target;
20 public UserDaoProxy(ISinger target){
21 this.target=target;
22 }
23 // 對(duì)目標(biāo)對(duì)象的sing方法進(jìn)行功能擴(kuò)展
24 public void sing() {
25 System.out.println("向觀眾問(wèn)好");
26 target.sing();
27 System.out.println("謝謝大家");
28 }
29 }
/**
2 * 測(cè)試類(lèi)
3 */
4 public class Test {
5 public static void main(String[] args) {
6 //目標(biāo)對(duì)象
7 ISinger target = new Singer();
8 //代理對(duì)象
9 ISinger proxy = new SingerProxy(target);
10 //執(zhí)行的是代理的方法
11 proxy.sing();
12 }
13 }
動(dòng)態(tài)代理
public interface ISinger {
2 void sing();
3 }
4
5 /**
6 * 目標(biāo)對(duì)象實(shí)現(xiàn)了某一接口
7 */
8 public class Singer implements ISinger{
9 public void sing(){
10 System.out.println("唱一首歌");
11 }
12 }
這回直接上測(cè)試,由于java底層封裝了實(shí)現(xiàn)細(xì)節(jié)(之后會(huì)詳細(xì)講),所以代碼非常簡(jiǎn)單,格式也基本上固定。
調(diào)用Proxy類(lèi)的靜態(tài)方法newProxyInstance即可,該方法會(huì)返回代理類(lèi)對(duì)象
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )
接收的三個(gè)參數(shù)依次為:
ClassLoader loader:指定當(dāng)前目標(biāo)對(duì)象使用類(lèi)加載器,寫(xiě)法固定
Class<?>[] interfaces:目標(biāo)對(duì)象實(shí)現(xiàn)的接口的類(lèi)型,寫(xiě)法固定
InvocationHandler h:事件處理接口,需傳入一個(gè)實(shí)現(xiàn)類(lèi),一般直接使用匿名內(nèi)部類(lèi)
public class Test{
2 public static void main(String[] args) {
3 Singer target = new Singer();
4 ISinger proxy = (ISinger) Proxy.newProxyInstance(
5 target.getClass().getClassLoader(),
6 target.getClass().getInterfaces(),
7 new InvocationHandler() {
8 @Override
9 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
10 System.out.println("向觀眾問(wèn)好");
11 //執(zhí)行目標(biāo)對(duì)象方法
12 Object returnValue = method.invoke(target, args);
13 System.out.println("謝謝大家");
14 return returnValue;
15 }
16 });
17 proxy.sing();
18 }
19 }