面向方法编程AOP学习之三
引言:
# 多才的表演家:Player2# 老板:Boss # 设备齐全的剧院:DynaProxyTheatre
作用:
多才的表演家:Player2
/** * 表演家接口 */public interface IPlayer2 {public void playPiano();public void playGuitar();}
package chat3;/** * 很会赚钱的老板 */public class Boss {/** * 卖票 */public void shellTicket() {System.out.println("shell many tickets ");}/** * 给酬劳 */public void givePlayerMoney() {System.out.println("give a little money to player.");}/** * 逃跑 */public void runAway() {System.out.println("The play is broken , the boss run away in a hurry");}}
package chat3;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * 可变式接收各种表演者<br> * 对剧院对各种表演者都可以支持 */public class DynaProxyTheatre implements InvocationHandler {/** * 目标的表演者 */public Object targetPlayer;/** * 用来接收目标表演者 * * @param target * 表演者 * @return 返回代理的接口 */public Object bind(Object target) {this.targetPlayer = target;return Proxy.newProxyInstance(targetPlayer.getClass().getClassLoader(),targetPlayer.getClass().getInterfaces(), this);}/** * 演出开始 */@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {Object result = null;Boss boss = new Boss();boss.shellTicket();System.out.println(" begin =>" + method.getName());try {// 动态调用方法result = method.invoke(targetPlayer, args);} catch (Exception e) {boss.runAway();}System.out.println(" end =>" + method.getName());boss.givePlayerMoney();return result;}}
@Testpublic void testChat3() {IPlayer2 player2 = (IPlayer2) new DynaProxyTheatre().bind(new Player2());player2.playGuitar();player2.playPiano();}
shell many tickets begin =>playGuitarplaying guitar... end =>playGuitargive a little money to player.shell many tickets begin =>playPianoplaying piano... end =>playPianogive a little money to player.
package chat3;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * 可变式接收各种表演者<br> * 对剧院对各种表演者都可以支持 */public class DynaProxyTheatre2 implements InvocationHandler {/** * 目标的表演者 */public Object targetPlayer;/** * 用来接收Boss的到来 */public Object proxy;/** * 用来接收目标表演者 * * @param target表演者 * @param proxy 切入的处理者(Boss) * @return 返回代理的接口 */public Object bind(Object target, Object proxy) {this.targetPlayer = target;this.proxy = proxy;return Proxy.newProxyInstance(targetPlayer.getClass().getClassLoader(),targetPlayer.getClass().getInterfaces(), this);}/** * 演出开始 */@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {Object result = null;// 代理与切入处理者的解耦调用方法Class shellTicket = this.proxy.getClass();// 反射得到操作者的shellTicket方法Method start = shellTicket.getDeclaredMethod("shellTicket",new Class[] { Method.class });// 反射执行shellTicket方法start.invoke(this.proxy, new Object[] { method });System.out.println(" begin =>" + method.getName());try {// 动态调用方法result = method.invoke(targetPlayer, args);} catch (Exception e) {Method runAway = shellTicket.getDeclaredMethod("runAway",new Class[] {});runAway.invoke(this.proxy, new Object[] { method });}System.out.println(" end =>" + method.getName());Method givePlayerMoney = shellTicket.getDeclaredMethod("givePlayerMoney", new Class[] { Method.class });givePlayerMoney.invoke(this.proxy, new Object[] { method });return result;}}