什么静态/动态代理,内容详解,只要看就会懂
Posted chai-blogs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么静态/动态代理,内容详解,只要看就会懂相关的知识,希望对你有一定的参考价值。
静态代理:自己创建代理类生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。
动态代理:
- 自动:可以根据我们的真实对象接口,自动生成一个增强型代码,而不要手动创建代理类写增强逻辑
- 运行时:可以在代码运行时,生成这个代理类,而不需要事先把这个类写好
废话少说,直接上代码
代码设计原则:
静态代理实现:
一、创建接口
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 }
输出结构:
以上是关于什么静态/动态代理,内容详解,只要看就会懂的主要内容,如果未能解决你的问题,请参考以下文章