反射运用----动态代理

      本人对动态代理的理解不深,下面实现的动态代理,大致是通过代理类得到的参数来决定调用的哪个实现类的实例,而这个参数可以动态的在配置文件中,也可以在数据库中保存,这样在不修改代码的情况下一样可以实现某些功能的转换。

例:三个人的工作,A是苦逼程序员,B是公务员,C是人民警察。这样可以写一个工作描述类接口IWorkDescribe,这时候实现类就有3个,WorkADescribeImpl,WorkBDescribeImpl , WorkCDescribeImpl。在正常情况下没问题,但是突然有一天B辞职了,转行为A了,这样在工作描述方法时就要修改代码,把WorkBDescribeImpl的所有实例化换成A,在代码复杂的情况下这样就很不方便而且容易出错。于是就利用反射,我们在配置文件时就给ABC三人一个工作参数,分别为A,B,C。通过代理,获取这3个人的工作参数来选取到底实例化哪个实现类,这样当某个人转行时,我们只需要修改配置文件中这个人的工作参数就可以了,这就是我理解和实现的动态代理。

代码实例

  1. //接口类
  2. public interface IWorkDescribe {
  3.     public void workService( );
  4. }
  5.  
  6. //A工作实现类
  7. public class WorkADescribeImpl implements IWorkDescribe {
  8.     @Override
  9.     public void workService( ){
  10.         System.out.println("工作A描述");
  11.     }
  12. }
  13.  
  14. //B工作实现类
  15. public class WorkBDescribeImpl implements IWorkDescribe {
  16.     @Override
  17.     public void workService( ){
  18.         System.out.println("工作B描述");
  19.     }
  20. }
  21.  
  22. //C工作实现类
  23. public class WorkCDescribeImpl  implements IWorkDescribe {
  24.     @Override
  25.     public void workService( ){
  26.         System.out.println("工作C描述");
  27.     }
  28. }
  29.  
  30. //代理类实现
  31. public class TranCodeServiceProxy {
  32.  
  33.     /**
  34.      * 获取并运行服务
  35.      * @param pack
  36.      * @param trancode
  37.      * @param params
  38.      * @return
  39.      * @throws TranCodeException
  40.      */
  41.     public static final void doService(String trancode)
  42.             throws Exception {
  43.         long startTime = System.currentTimeMillis();
  44.         try {
  45.             IWorkDescribe server = getService(trancode);//获取代理类对象
  46.             System.out.println("代理器启动服务【" + trancode + "】获取服务成功:"
  47.                     + server);
  48.             doService(server);
  49.         } catch (Exception e) {
  50.             System.out.println("代理器启动服务【" + trancode + "】失败:"
  51.                     + e.getMessage());
  52.             throw e;
  53.         } finally {
  54.             System.out.println("代理器启动服务【" + trancode
  55.                     + "】完成,用时(ms):" + (System.currentTimeMillis() - startTime));
  56.         }
  57.     }
  58.  
  59.   
  60.     /**
  61.      * 获取服务
  62.      * @param pack
  63.      * @param trancode
  64.      * @return
  65.      * @throws TranCodeException
  66.      */
  67.     private static final IWorkDescribe getService(String trancode) throws Exception {
  68.         try {
  69.             Class<?> clazz = Class.forName("com.work.service."
  70.                     + "Work"
  71.                     + trancode
  72.                     + "DescribeImpl");
  73.             return (IWorkDescribe) clazz.newInstance();
  74.         } catch (Exception e) {
  75.             throw new Exception("未知服务代码【"
  76.                     + trancode + "】", e);
  77.         }
  78.     }
  79.  
  80.  
  81.     /**
  82.      * 运行服务
  83.      * @param server
  84.      * @param params
  85.      * @return
  86.      * @throws TranCodeException
  87.      */
  88.     private static final void doService(IWorkDescribe server) throws Exception {
  89.         try {
  90.             server.workService();//运行接口实现类方法
  91.         } catch (Exception e) {
  92.             throw (Exception)e;
  93.         }
  94.         System.out.println("代理器启动服务【" + server + "】处理结果:"
  95.                 + "成功");
  96.     }
  97. }
  98.  
  99.  
  100. //测试类
  101. public class TestMain {
  102.     /**
  103.      * @param args
  104.      */
  105.     public static void main(String[] args) {
  106.         String people1 = "A";//可以从配置文件或者数据库读取这个值,由这个值来指定调用哪个哪个实现类
  107.         String people2 = "B";
  108.         String people3 = "C";
  109.         try {
  110.             TranCodeServiceProxy.doService(people1);
  111.             TranCodeServiceProxy.doService(people2);
  112.             TranCodeServiceProxy.doService(people3);
  113.         } catch (Exception e) {
  114.             e.printStackTrace();
  115.         }
  116.     }
  117. }

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值