概述
最基础的动态代理一般需要三个类,分别是:
- 主题角色接口,主要用来定义操作;
- 主题角色接口实现类,主要实现接口中定义的操作;
- 主题角色处理器类,该类实现 java.lang.reflect.InvocationHandler 接口,并定义主题角色实现类方法被调用前或调用后的其他处理;
下面是一个游戏打怪案例:
主题角色接口
public interface IGamePlayer {
//登录
void login(String user,String password);
//杀怪
void killBoss();
//升级
void upgrage();
//每个人都可以找一下自己的代理
}
题角色接口实现类
public class GamePlayer implements IGamePlayer {
private String name;
public GamePlayer(String name) {
this.name = name;
}
@Override
public void login(String user, String password) {
System.out.println("登录名为:" + user + "的用户" + this.name+ "登录成功!");
}
@Override
public void killBoss() {
System.out.println(this.name + "在打怪");
}
@Override
public void upgrage() {
System.out.println(this.name + "又升了一级");
}
}
主题角色处理器类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class GamePlayIH implements InvocationHandler {
//被代理者
Class cls = null;
//被代理的实例
Object obj = null;
//我要代理谁
public GamePlayIH(Object obj) {
this.obj = obj;
}
//调用被代理的方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Thread.sleep(1200);
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(df.format(new Date()) + " 方法:" + method.getName() + "被调用");
Object result = method.invoke(this.obj,args);
return result;
}
}
客户端类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Client {
public static void main(String[] args) {
//定义一个痴迷的玩家
IGamePlayer player = new GamePlayer("张三");
//定义一个handler
InvocationHandler handler = new GamePlayIH(player);
//开始打游戏,记下时间戳
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("开始时间是:" + df.format(new Date()));
//获得类的class loader
ClassLoader c1 = player.getClass().getClassLoader();
//动态产生一个代理者
IGamePlayer proxy = (IGamePlayer) Proxy.newProxyInstance(c1,new Class[]{IGamePlayer.class},handler);
//登录
proxy.login("zhangsan","1234");
//开始杀怪
proxy.killBoss();
//升级
proxy.upgrage();
//记录结束游戏时间
System.out.println("结束时间是:" + df.format(new Date()));
}
}