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

一时失言乱红尘 2024-02-18 23:47 109阅读 0赞

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

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

发表评论

表情:
评论列表 (有 0 条评论,109人围观)

还没有评论,来说两句吧...

相关阅读

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

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

    相关 反射动态代理

    实例说明   代理是Java SE 1.3版新增的特性。使用代理可以在程序运行时创建一个实现指定接口的新类。通常只有在编译时无法确定需要使用哪个接口时才需要使用代理,这

    相关 反射_应用:Java动态代理

    动态代理特别重要,Java的框架都爱这玩意儿!!! 动态代理特别重要,Java的框架都爱这玩意儿!!! 动态代理特别重要,Java的框架都爱这玩意儿!!!

    相关 反射机制与动态代理

    以前学习基础的时候不知道哪些是重点,也不会注意,自己动手少,用的少,自然也不会知道,就落下了知识点,当被问反射机制起来时,听过,但怎么说,到底是怎么一回事,脑子一片空白,答不上

    相关 Java反射动态代理

    反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多。要怎么理解以上这句话,请看下文。