在了解jdk代理之前,我們要知道什么是動態代理?動態代理可以干什么呢?
簡介:
-
-
真實對象實現抽象對象所有的功能
-
通過Proxy類,創建代理對象,調用代理方法
-
在InvocationHandler的invoke對代理的方法有選擇的修改或不修改真實對象原有的方法。
抽象角色
package com.it.proxy; /** 抽象角色:定義功能 */ public interface Star { /** 唱歌 @param song */ void sing(String song); /** 演出 @param money */ void act(int money); }
真實角色
明星只負責唱歌、拍戲。
package com.it.proxy; /** 真實角色 */ public class SuperStar implements Star { @Override public void sing(String song) { System.out.println("明星唱:" + song); } @Override public void act(int money) { System.out.println("明星拍戲出場費:" + money); } }
jdk動態代理角色
代理幫助明星收費,查看錢滿不滿足明星的要求。
package com.it.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class Fans { public static void main(String[] args) { /* 使用JDK動態代理,創建代理對象 參數1:類加載器 參數2:所有實現的接口 參數3:方法調用的接口,Star接口中每個方法都會調用一次 */ Star s2 = (Star) Proxy.newProxyInstance( s1.getClass().getClassLoader(), new Class[]{Star.class}, new InvocationHandler() { /* 對每個方法進行功能增強 參數1:代理對象,不能直接調用,不然出現遞歸 參數2:每個方法對象,如:sing() act(),每個方法都會調用一次 參數3:方法傳遞的參數,如:歌名 返回值:調用的方法的返回值 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //如果是演出的方法,判斷是否小於1000,如果小於則不演出,否則調用原來的方法 String methodName = method.getName(); if ("act".equals(methodName)) { //得到演示參數值 int money = (int) args[0]; if (money < 1000) { System.out.println("費用太低,不演出了"); return null; } } //其它的情況就調用真實對象原來的方法 return method.invoke(s1, args); //真實對象,方法的參數 } });
//fans請自己喜歡的明星出場唱歌,拍戲 s2.sing("只因你太美");
//費用過低不滿足 s2.act(500); } }