静态代理,动态代理,Cglib代理详解
一.静态代理
新建一个接口 定义一个玩家方法:
package com."".proxy.staticc; public interface Iplayer { public void play(); }
建一个你自己玩游戏的类
package com."".proxy.staticc; public class YourPlayer implements Iplayer { public void play() { System.out.println("登录"); System.out.println("刷图中======"); System.out.println("刷图中======"); System.out.println("刷图中======"); System.out.println("退出"); } }
建立代理类
package com."".proxy.staticc; public class DaLiPlayer implements Iplayer{ private Iplayer player = new YourPlayer(); public DaLiPlayer(Iplayer player){ this.player = player; } //环绕通知 public void play() { System.out.println("代练");//前置通知 player.play(); System.out.println("还号");//后置通知 } }
开始代理玩游戏
package com."".proxy.staticc; public class Client { public static void main(String[] args) { //传递玩家账号 YourPlayer yourPlayer = new YourPlayer(); //找到代理人 DaLiPlayer daLiPlayer = new DaLiPlayer(yourPlayer); //开始玩游戏 daLiPlayer.play(); } }
二.动态代理
动态代理的方法和静态比较类似 只是可以动态的代理目标 这里展示下具体代码
package com."".jdkproxy; public interface Iplayer { String name = "123"; public abstract void play(); }
package com."".jdkproxy; public class DnfPlayer implements Iplayer { public void play() { System.out.println("我只玩DNF,把你们负责人叫出来!"); } }
package com."".jdkproxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyPlay implements InvocationHandler{ private Object targetObject = new Object(); public Object createProxy(Object targetObject){ this.targetObject = targetObject; return Proxy.newProxyInstance( targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("前置代理"); Object obj = method.invoke(targetObject, args); System.out.println("后置代理"); return obj; } }
package com."".jdkproxy; public class Test { public static void main(String[] args) { //获得需求的玩家 Iplayer player = new DnfPlayer(); //找对应的代理对象 ProxyPlay proxy = new ProxyPlay(); //执行代练方法 Iplayer pl = (Iplayer) proxy.createProxy(player); pl.play(); //魔兽玩家 WowPlayer wow = new WowPlayer(); Iplayer pl2 = (Iplayer) proxy.createProxy(wow); pl2.play(); } }
三.Cglib代理详解
package com."".cglibproxy; public interface IPlayer { public void play(); }
package com."".cglibproxy; public class DNFPlayer implements IPlayer{ public void play() { System.out.println("我只玩DNF 给我找个代练"); } }
package com."".cglibproxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; //cglib代理 public class ProxyHome implements MethodInterceptor{ private Object tarObject; public Object createCglib(Object tarObject){ this.tarObject = tarObject; Enhancer enhancer = new Enhancer(); enhancer.setClassLoader(tarObject.getClass().getClassLoader()); enhancer.setInterfaces(tarObject.getClass().getInterfaces()); enhancer.setCallback(this); return enhancer.create(); } public Object intercept(Object obj, Method method, Object[] args, MethodProxy arg3) throws Throwable { System.out.println("给你登录代练开始"); Object object = method.invoke(tarObject, args); System.out.println("给你退出代练结束"); return object; } }
package com."".cglibproxy; public class Test { public static void main(String[] args) { IPlayer p2 = new DNFPlayer(); ProxyHome proxy = new ProxyHome(); IPlayer tp = (IPlayer) proxy.createCglib(p2); tp.play(); } }