一.静态代理
新建一个接口 定义一个玩家方法:
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(); } }