標籤:style blog color java 使用 os io strong
動態代理:動態代理是指在實現階段不需要關心代理誰,而在運行階段才指定代理哪一個對象。Spring AOP採用的核心思想就是動態代理設計模式。
下面看動態代理的UML類圖:
下面思考問題:invocationHandler的invoke方法是由誰來調用的,代理對象是怎麼產生的?
動態代理類:
package com.lp.ecjtu.DynamicProxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/** * 動態代理類,代理玩遊戲練級的代練者 * @author Administrator * */public class GamePlayerhandler implements InvocationHandler{ //被代理對象,也就是目標對象 private Object target; public GamePlayerhandler(Object realObject){ this.target = realObject; } /** * 在目標對象的方法前面執行的業務員邏輯 */ public void beforeMethod(){ System.out.println("***********商務邏輯before************"); } /** * 在目標對象的執行的方法後執行的商務邏輯 */ public void afterMehod(){ System.out.println("************商務邏輯after************"); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { beforeMethod(); //執行目標對象的方法,也就是反射後真實類中的方法 Object result = method.invoke(target, args); //為了防止盜號,如果想讓遊戲登陸後發個資訊給我們,直接修改GamePlayerServiceImp? //不是好方法,可以在這個方法裡面修改 //被代理對象的方法名稱等於login if(method.getName().equalsIgnoreCase("login")){ System.out.println("有人在用你的帳號登陸,請確認是否是本人!"); } afterMehod(); return result; }}
目標類對象介面:(被代理類):
package com.lp.ecjtu.DynamicProxy;/** * 目標對象實現的介面,用JDK來組建代理程式對象一定要實現一個介面 * @author Administrator * */public interface IGamePlayerService { //代理對象將實現目標對象介面下面的所有方法 //登陸遊戲 public void login(String user,String password); //殺怪 public void killBoss(); //升級 public void upgrade();}
目標實作類別:
package com.lp.ecjtu.DynamicProxy;/** * * @author Administrator * 目標類,被代理的對象類 */public class GamePlayerServiceImp implements IGamePlayerService{ private String playerName; public GamePlayerServiceImp(){ } public GamePlayerServiceImp(String playerName){ this.playerName = playerName; } @Override public void killBoss() { System.out.println("正在打怪中---------"); } @Override public void login(String user, String password) { System.out.println(" 陸遊戲----------"); } @Override public void upgrade() { System.out.println("打怪升級中--------"); }}
遊戲用戶端:
package com.lp.ecjtu.DynamicProxy;import java.lang.reflect.Proxy;public class GameClient { /** * @param args */ public static void main(String[] args) { //被代理對象的執行個體化,也可以說成目標對象的執行個體化 IGamePlayerService realPlayer = new GamePlayerServiceImp("代練者張三"); //執行個體化一個handler GamePlayerhandler handler = new GamePlayerhandler(realPlayer); //獲得類的ClassLoader ClassLoader classloader = realPlayer.getClass().getClassLoader(); //代理對象實現目標對象的介面,還可以使用new Class[]{IGamePlayerService.class} Class<?>[] interfaces = realPlayer.getClass().getInterfaces(); //根據目標對象動態產生一個代理者 IGamePlayerService proxy = (IGamePlayerService) Proxy.newProxyInstance( classloader, interfaces, handler); //代練者登陸 proxy.login("張三", "123"); //打怪 proxy.killBoss(); //升級 proxy.upgrade(); }}