1700460881
1700460882
}
1700460883
1700460884
}
1700460885
1700460886
其中invoke方法是接口InvocationHandler定义必须实现的,它完成对真实方法的调用。我们来详细讲解一下InvocationHanlder接口,动态代理是根据被代理的接口生成所有的方法,也就是说给定一个接口,动态代理会宣称“我已经实现该接口下的所有方法了”,那各位读者想想看,动态代理怎么才能实现被代理接口中的方法呢?默认情况下所有的方法返回值都是空的,是的,代理已经实现它了,但是没有任何的逻辑含义,那怎么办?好办,通过InvocationHandler接口,所有方法都由该Handler来进行处理,即所有被代理的方法都由InvocationHandler接管实际的处理任务。
1700460887
1700460888
我们接下来看看场景类,如代码清单12-23所示。
1700460889
1700460890
代码清单12-23 动态代理的场景类
1700460891
1700460892
public class Client{
1700460893
1700460894
public static void main(String[]args)throws Throwable{
1700460895
1700460896
//定义一个痴迷的玩家
1700460897
1700460898
IGamePlayer player=new GamePlayer(“张三”);
1700460899
1700460900
//定义一个handler
1700460901
1700460902
InvocationHandler handler=new GamePlayIH(player);
1700460903
1700460904
//开始打游戏,记下时间戳
1700460905
1700460906
System.out.println(“开始时间是:2009-8-25 10
:45”);
1700460907
1700460908
//获得类的class loader
1700460909
1700460910
ClassLoader cl=player.getClass().getClassLoader();
1700460911
1700460912
//动态产生一个代理者
1700460913
1700460914
IGamePlayer proxy=(IGamePlayer)Proxy.newProxyInstance(cl,new
1700460915
1700460916
Class[]{IGamePlayer.class},handler);
1700460917
1700460918
//登录
1700460919
1700460920
proxy.login(“zhangSan”,“password”);
1700460921
1700460922
/开始杀怪
1700460923
1700460924
proxy.killBoss();
1700460925
1700460926
//升级
1700460927
1700460928
proxy.upgrade();
1700460929
1700460930
//记录结束游戏时间
[
上一页 ]
[ :1.700460881e+09 ]
[
下一页 ]