Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 244|回复: 0

[Java反射学习]用反射机制实现运行期函数定位

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-30 23:58:07 | 显示全部楼层 |阅读模式
    在通常的程序运行过程中,具体调用那个函数是事先编制程序时已经指定好了,运行时是按照以前拟定的流程运行。但有时在程序运行后才能指定调用那个函数,如TCP/IP通信时的命令执行,用户自定义方案的解读,表达式解析等场合,程序员首先得到是一个有规则的字符串,他必须解析这个字符串,再确定具体由那个函数来调用。   一般的处理是在解析后,通过特定的字符来决定程序下一步的去向,这样通常有一个庞大的分支语句在等待你创建,扩充和维护(硬编码的典型样板),你必须同时处理好至少两个类才能找到最终函数的归宿,这无疑加大了类与类之间的偶合度, 这与现代软件所追求的高内聚低耦合背道而驰。但java反射机制可以拯救我们脱离苦海。

         以下例子实现了一个简单的计算式解析(加,减,乘,除)的功能。  
      
       
       
         
       

         
       
      
      下面是具体的实现
    (1)计算类代码:
    // 这个类用来实现具体的计算过程,
    public class Caculator{
          public int sum(int x,int y){
            return x+y;
          }

          public int substract(int x,int y){
            return x-y;
          }

          public int multi(int x,int y){
             return x*y;
           }

            public int divide(int x,int y){
                return x/y;
            }
    }


    (2)外部适配器类,用来实现到Caculator具体函数的导向,并隐藏具体接口,统一对外表现为invokeMethod接口。
    import java.lang.reflect.Method;

    public class Adaptor{
         private Adaptor(){
          }

         public static int invokeMethod(String methodName,int x,int y){
               Integer retval=new Integer(0);
               try{
                    // Get Class
                    String className="Caculator";
                    Class nativeClass=Class.forName(className);
                    Caculator caculator=(Caculator)nativeClass.newInstance();

                   // Setup parameter type array
                    Class types[]=new Class[2];
                    types[0]=Integer.TYPE;
                    types[1]=Integer.TYPE;

                 // Setup method
                    Method method=nativeClass.getMethod(methodName,types);

                   // Setup parameter array
                     Object inParams[]=new Object[2];
                     inParams[0]=new Integer(x);
                     inParams[1]=new Integer(y);

                      // Invoke method
                       retval=(Integer)method.invoke(caculator,inParams);
               } catch(Exception ex){
                   StackTraceElement errElement=ex.getStackTrace()[ex.getStackTrace().length-1];
                    System.out.println("Error File="+errElement.getFileName()+"        "+"Error Line="+errElement.getLineNumber());
                 }

          return retval.intValue();
         }
    }

    (3)具体调用如下:
    int x=10;
    int y=2;

    System.out.println("x sum y="+Adaptor.invokeMethod("sum",x,y));
    System.out.println("x substract y="+Adaptor.invokeMethod("substract",x,y));
    System.out.println("x multi y="+Adaptor.invokeMethod("multi",x,y));
    System.out.println("x divide y="+Adaptor.invokeMethod("divide",x,y));

    (4)输出如下:
    x sum y=12
    x substract y=8
    x multi y=20
    x divide y=5

    由上述程序可见,它完全实现了程序运行期函数定位,消除了分支语句,如果增加一种操作,只需在Caculator类中增加相应的函数即可,其他部分不需改变,Adaptor类可以作为反射导向类的模版使用,只需稍加改变就可以适应多种情况。大家应该
    学会这种动态导向方法。



      
      
       
       

         
       

         
       
      
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-5 19:58 , Processed in 0.416441 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表