`
stonejava
  • 浏览: 77833 次
  • 性别: 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反射机制.pdf

    Java反射机制允许程序在运行时通过`Reflection APIs`获取类的内部信息,包括修饰符(如`public`、`static`等)、父类(如`Object`)、接口(如`Cloneable`)以及字段和方法的信息,并能够在运行时改变字段的值或调用...

    深入理解Java的反射机制Java系列2021.pdf

    Java的反射机制是Java语言提供的一种能力,它允许程序在运行期动态地访问和修改类的属性和方法。对于理解Java反射机制,需要掌握以下核心知识点: 1. 反射机制基础: Java程序在编译期和运行期有不同的处理过程。...

    Java反射机制概述.zip

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象以及它们的方法和字段。通过反射,开发者可以实现动态类型检查、元编程、插件系统等功能,大大增强了代码的灵活性和可扩展...

    Java中的反射机制.doc

    了解并熟练掌握Java反射机制对于编写更灵活、可扩展的Java应用程序至关重要。通过反射,开发者可以编写出更加通用的代码,实现一些在编译期无法预知的高级功能。然而,反射的强大也伴随着复杂性,因此在实际开发中,...

    jdk反射机制资料大合集

    在标题"jdk反射机制资料大合集"中,我们可以理解这是一份包含多本书籍的资源包,专门针对Java反射机制进行深入讲解,包括中英文版本,旨在帮助开发者更好地理解和运用这一技术。 描述中提到,这个资料包包含了8本书...

    自定义运行期注解

    本篇文章将深入探讨如何创建和使用自定义运行期注解,以及如何利用反射机制来获取和处理这些注解。 首先,让我们了解什么是注解。注解是Java语言的一个特性,它提供了一种声明式的方式来向编译器或JVM提供元数据。...

    Android-注解与反射注解知识点反射知识点注解java反射

    在Java中,注解分为保留期注解(如@Override、@Deprecated)、编译器注解(用于编译时检查)和运行时注解(可以在运行时通过反射获取)。 2. **自定义注解**:开发者可以通过`@interface`关键字自定义注解,定义...

    Java反射技术详解及实例解析

    Java反射技术是Java编程语言中的一个强大特性,它允许程序在运行时检查并操作类、接口、对象等的内部信息,包括但不限于类名、方法、字段等。这种能力使得Java程序具有高度的灵活性和动态性,是许多高级框架和库的...

    JAVA程序设计笔试题目复习大纲

    - **类型擦除**:理解编译期泛型与运行时类型的关系。 8. **Java 8新特性** - **Lambda表达式**:简化匿名内部类,提高代码可读性。 - **Stream API**:进行集合的高级操作,如过滤、映射、聚合等。 - **函数式...

    Java反射基础入门,一篇就够啦

    Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。本文将详细介绍Java反射的基础知识,包括反射的基本概念、工作原理、使用方法及优缺点。 1. 反射的基本...

    Java语言程序设计(复习题,课后习题答案)第十版

    7. **注解(Annotation)**:用于提供元数据,可以被编译器或JVM在编译期或运行期处理。 8. **枚举(Enum)**:一种特殊的类,用于表示有限的固定集合。 9. **Java 8及更高版本的新特性**:如Lambda表达式、Stream...

    Kotlin中的反射机制深入讲解

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

    JAVA实现动态代理的简单流程

    动态代理,顾名思义,是在运行时动态创建代理对象的一种机制,它无需在编译期就确定代理类的具体实现,而是通过反射等技术在运行时自动生成代理类,从而达到灵活扩展原有接口功能的目的。这种机制广泛应用于AOP...

    Java语言理解程序逻辑

    注解则提供了一种元数据的方式,可以在编译期或运行期对代码进行标记和处理,增强了程序的自省能力和动态性。 10. **模块化系统(Jigsaw)**:从Java 9开始,Java引入了模块化系统,有助于大型项目管理和提升性能。...

    基于java_字节码的灰盒动态漏洞检测.pdf

    在启动时,通过`-javaagent`参数加载agent代理,而在运行期则可以通过Attach API动态加载。 在Java Agent中,`Instrumentation`接口提供了动态修改字节码的能力。Javassist是一个强大的开源库,它允许开发者无需...

    Java程序设计1001例

    12. **注解与元编程**: 学习自定义注解,以及如何在编译期或运行期处理注解,提升代码的可维护性和扩展性。 13. **IO与NIO**: 深入理解Java的I/O模型,对比传统的阻塞I/O和非阻塞I/O(New IO),提高系统性能。 14...

    java学习150个经典的例子

    11. **反射机制**:Java的反射机制允许程序在运行时动态地获取类的信息并操作类的对象。通过例子,你可以学习如何使用Class类、Method类和Constructor类。 12. **泛型**:泛型提高了代码的安全性和可读性。实例会...

    C#反射参考

    3. 运行期获取类型信息的应用: 虽然反射可能导致性能损失,但它提供了许多优势,尤其是在设计具有高度灵活性和可扩展性的系统时。例如,插件式架构经常利用反射加载和调用外部插件中的方法。假设我们有一个电子...

    Java程序设计技巧1001例

    5. **100.006:反射** - 反射机制允许在运行时动态访问和修改类的信息,包括创建对象、调用方法和访问字段。这是Java中强大的工具,但使用时需谨慎,以防安全和性能问题。 6. **100.007:设计模式** - 23种经典设计...

    JAVA程序设计自测题库及答案

    8. **反射**:Java反射API允许程序在运行时检查类的信息(如类名、方法名、参数类型等),动态创建对象并调用方法。 9. **接口与内部类**:接口定义了类必须实现的方法,是实现多继承的方式。内部类分为成员内部类...

Global site tag (gtag.js) - Google Analytics