什么是JAVA静态/动态代理,内容详解,只要看就会懂

静态代理:自己创建代理类生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。

动态代理:

  1. 自动:可以根据我们的真实对象接口,自动生成一个增强型代码,而不要手动创建代理类写增强逻辑
  2. 运行时:可以在代码运行时,生成这个代理类,而不需要事先把这个类写好

废话少说,直接上代码

代码设计原则:

静态代理实现:

一、创建接口

1 public interface IGamePlayer {
2     
3     //登录
4     public void login(String username ,String password);
5       //打怪
6     public void killboss();
7       //升级
8     public void upgrade();
9 }

二、创建实现类

 1 public class GamePlayer implements IGamePlayer{
 2 
 3     private String name;
 4     
 5     public GamePlayer(String name) {
 6         this.name = name ;
 7     }
 8     
 9     @Override
10     public void login(String username ,String password) {
11         // TODO Auto-generated method stub
12         System.out.println(username+":登录成功");
13     }
14 
15     @Override
16     public void killboss() {
17         // TODO Auto-generated method stub
18         System.out.println(this.name+"正在打怪");
19     }
20 
21     @Override
22     public void upgrade() {
23         // TODO Auto-generated method stub
24         System.out.println(this.name+"已升级");
25     }
26 
27 }

三、创建静态代理类

 1 public class GamePlayerProxy implements IGamePlayer{
 2 
 3     private IGamePlayer player;
 4     
 5     public GamePlayerProxy(IGamePlayer player) {
 6         // TODO Auto-generated constructor stub
 7         this.player = player;
 8     }
 9     
10     @Override
11     public void login(String username, String password) {
12         // TODO Auto-generated method stub
13         this.player.login(username, password);
14     }
15 
16     @Override
17     public void killboss() {
18         // TODO Auto-generated method stub
19         this.player.killboss();
20     }
21 
22     @Override
23     public void upgrade() {
24         // TODO Auto-generated method stub
25         this.player.upgrade();
26     }
27 
28 }

测试输出:

 1 public class GameTest {
 2     public static void main(String[] args) {
 3         
 4         //静态代理
 5         IGamePlayer player = new GamePlayer("龙大侠");
 6         IGamePlayer proxy = new GamePlayerProxy(player);
 7         proxy.login("long", "123456");
 8         proxy.killboss();
 9         proxy.upgrade();
10 
11     }
12 }

输出结果:

动态代理实现:

四、创建动态代理类

 1 import java.lang.reflect.InvocationHandler;
 2 import java.lang.reflect.Method;
 3 
 4 public class DynamicProxyHandler implements InvocationHandler{
 5 
 6     private IGamePlayer player;
 7     
 8     public DynamicProxyHandler(IGamePlayer player) {
 9         this.player = player;
10     }
11     
12     @Override
13     public Object invoke(Object proxy, Method method, Object[] args)
14             throws Throwable {
15         if(method.getName().equals("killboss")){
16             System.out.println("戴上戒指打怪……");
17         }
18         
19         return method.invoke(player, args);
20     }
21 
22 }

测试输出

 1 import java.lang.reflect.InvocationHandler;
 2 import java.lang.reflect.Proxy;
 3 
 4 public class GameTest {
 5     public static void main(String[] args) {
 6         
 7         //静态代理
 8 //        IGamePlayer player = new GamePlayer("龙大侠");
 9 //        IGamePlayer proxy = new GamePlayerProxy(player);
10 //        proxy.login("long", "123456");
11 //        proxy.killboss();
12 //        proxy.upgrade();
13         
14         
15         //动态代理
16         IGamePlayer player = new GamePlayer("龙大侠");
17         
18         //定义触发管理器
19         InvocationHandler hander = new DynamicProxyHandler(player);
20         
21         //创建动态代理对象(三个参数:loader类加载器:把Java字节码文件加载到JVM里 。Class:被代理对象实现的所有接口。实现了触发管理器InvocationHandler的这个类
22         IGamePlayer proxy = (IGamePlayer) Proxy.newProxyInstance(player.getClass().getClassLoader(), new Class[]{IGamePlayer.class}, hander);
23         proxy.login("long", "123456");
24         proxy.killboss();
25         proxy.upgrade();
26     }
27 }

输出结构:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值