`
stonejava
  • 浏览: 76792 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用Java反射机制实现程序运行期函数定位

阅读更多

在通常的程序运行过程中,具体调用那个函数是事先编制程序时已经指定好了,运行时是按照以前拟定的流程运行。但有时在程序运行后才能指定调用那个函数,如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接口。

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(10);
                       inParams[1]=new Integer(2);
                       
                       // 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()+"\t"+
                                                          "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类可以作为反射导向类的模版使用,只需稍加改变就可以适应多种情况。我们应该熟悉这种动态导向方法。 <!---->

分享到:
评论

相关推荐

    Java高级程序设计实战教程第三章-Java反射机制.pptx

    Java高级程序设计 第3章 Java反射机制 3.1 应用场景 3.2 相关知识3.3 实施过程 3.4 拓展知识3.5 拓展训练 3.6 课后小结3.7 课后习题 3.8 上机实训 Java高级程序设计实战教程第三章-Java反射机制全文共15页,当前为第...

    Kotlin中的反射机制深入讲解

    Java中的反射机制,使得我们可以在运行期获取Java类的字节码文件中的构造函数,成员变量,成员函数等信息。这一特性使得反射机制被常常用在框架中,想要比较系统的了解Kotlin中的反射,先从Java的反射说起。 Java中...

    超爽的自学课件(java)

    1) 第1章:对象入门 这一章是对面向对象的程序设计(OOP)的一个综述,其中包括对“什么是对象”之类的基本问题的回答,并讲述了接口与实现、抽象与封装、消息与函数、继承与合成以及非常重要的多形性的概念。...

    java 编程入门思考

    11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...

    Java初学者入门教学

    11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...

    java联想(中文)

    11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...

    Thinking in Java 中文第四版+习题答案

    11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 12.2.4...

    JAVA_Thinking in Java

    11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...

    Thinking in Java简体中文(全)

    11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...

    Think in Java(中文版)chm格式

    11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...

    asp.net知识库

    利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的内容是否合法 asp.net报表解决方法 SQLDMO类的使用 SQL过程自动C#封装,支持从表到基本存储过程生成 使用SQLDMO控制 SQL Server 使用SQL...

    ThinkInJava

    11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...

    thinkinjava

    11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...

    Spring面试题

    3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。 2. ...

Global site tag (gtag.js) - Google Analytics