`
dandada
  • 浏览: 16695 次
社区版块
存档分类
最新评论

JAVA如何通过函数名调用函数

    博客分类:
  • Java
阅读更多
从需求看问题会更清晰,更容易记住。

需求

我有一个自动化测试的用例用来测试一系列金融产品(Security)的交易过程(DoTrade),已开始金融产品就两三个,代码写成下面这样:

public void testDoTrade(String securityType){	
	Security s;
	if(securityType == "Stock"){
		s = new Stock();
		s.doTrade();
	}Else if(securityType == "Bond"){
		s = new Bond();
		s.doTrade();
	}
}


很快,待测的金融产品越来越多,代码变得越来越冗余,并且需要反复的编译主类

解决

于是需要重构代码,代码可以一开始就设计得很周到,但是也可以遇到需求了再立即进行重构,各有各的好处,在快速的测试开发中,我会使用后一种方式,这种方式更加符合敏捷的思想。

import java.lang.reflect.*;

public void testDoTrade(String securityType){	
	Try{
		Class cls = Class.forName(securityType);
		Constructor c = cls.getConstructor();
		Object obj = c.newInstance();
		
		Method m = cls.getMethod("doTrade");
		m.invoke(obj);		
	}	
}

这样如果测试用例中加入了一个外汇的金融产品,我只需要定义一个外汇类(ForeignExchange),并编译出class文件即可。

总结:
以上其实就是Java反射的一个应用,在这个应用当中,我们可以在调用代码中动态的调用未知的类的函数,而且后续开发中再添加那些未知的类。这种动态调用的场景是反射的一个主要应用之一。当然反射还有很多其他的作用,比如突破private权限等,可能会在另外一篇笔记当中详细描述。
分享到:
评论

相关推荐

    ocos2d-x 通过JNI实现c/c++和Android的java层函数互调

    cocos2d-x 通过JNI实现c/c++和Android的java层函数互调, 本文主要实现两个功能: (1)通过Android sdk的API得到应用程序的包名(PackageName),然后传递给c++层函数。 (2)通过c++函数调用Android的java层函数,显示一...

    在C#中调用 java的函数(C#与java结合使用)的ikvm相关包

    a:下载ikvm-0.40.0.1.zip;ikvmbin-0.40.0.1.zip;openjdk6-b12-stripped.zip; 解压ikvm-0.40.0.1.zip,并将%IKVM_HOME%\bin添加到path中。此处的%IKVM_HOME%是指解压后ikvm的主... 其中,using 后面跟java类的包名。

    java用JNA调用dll实例,包含各种参数调用

    实例中演示了各种参数形式的DLL函数调用,如:基本数据类型、基本数据类型的指针和引用、结构体、结构体的指针和引用、函数指针和回调函数、字符串指针、输入数组、输出数组等,非常实用。

    Java JNI调用C语言写的清屏的动态链接库

    请注意代码中的函数JNIEXPORT void JNICALL Java_Test_cls(JNIEnv *env, jobject obj),函数名字的Test是指使用该函数的Java类的类名,cls是java代码使用的清屏函数的函数名。 动态链接库是使用VC++6.0生成的。 具体...

    Oracle第3章及java调用过程函数.rar

    Java调用过程的几个步骤: 1.创建连接对象 2.得到CallableStatement对象, CallableStatement cst=conn.prepareCall("{call 过程名(?...=call 函数名(?,?... )}"); //第1个?代表函数返回值,后面的 ?代表函数的参数

    Java 回调函数详解及使用

     直接调用:在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行。这里,A称为“主叫函数”(Caller),B称为“被叫函数”(Callee)。  间接调用:在函数A的函数体里并不出现函数...

    JNI技术手册 c/c++调用java

    II. java c/cpp互相调用实例(姊妹篇之一)——java调用c/cpp 4 一 先制作一个系统中有的DLL文件(cpp给出的sdk接口) 4 二 JNI 7 1、 编写java文件 7 2、 生成.h头文件 8 3、 用c/cpp实现这个头文件 9 三 测试 10 ...

    实用技术在Android 应用中调用 C++ 代码并在新线程中执行 Java 静态方法

    这是 Kotlin 语言编写...这个接口函数的作用是创建新线程,并在新线程中调用 callJavaStaticMethod 方法,这个方法会获取当前线程的 JNIEnv 对象和 Java 类对象,并通过这些对象调用 Java 层的静态方法 staticMethod。

    使用Java Native Interface调用本地C++代码.txt

    在这个例子中,我们使用Java Native Interface(JNI)来调用本地的C++代码。首先,我们需要在Java类中声明一个native方法,并使用`native`关键字来修饰它。然后,我们需要使用`System.loadLibrary()`方法来加载本地...

    java源码包---java 源码 大量 实例

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    函数、内存、一维数组、二维数组

    •修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,...) { 执行语句; return 返回值; } 返回值类型:函数运行后的结果的数据类型。 参数类型:是形式参数的数据类型。 形式参数...

    Java初认识–函数和数组

     修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参2)  {  执行语句;  return返回值;  }  返回值类型:函数运行后的结果的数据类型。  参数类型:是形式参数的数据类型。  形式...

    Java开发技术大全(500个源代码).

    HelloNative.java 准备调用C函数的java文件 HelloNative.lib 用VC编译生成的静态库文件 HelloNative.obj 用VB编译生成的目标文件 HelloNativeTest.java 测试本地化是否成功的类文件 instanceVar.java 定义一个...

    建立一个名为Student的类,该类有以下几个私有成员变量:学生姓名、学号、性别、年龄。还有以下两个成员函数:一个用于初始化学生姓名、学号、性别和年龄的构造函数,一个用于输出学生信息的函数。编写一个主函数。声明一个学学生对象。然后调用成员函数在屏幕输出学生信息。

    C++考试题目: 题目:建立一个名为Student的类,该类有以下几个私有成员变量:学生姓名、学号、性别、年龄。...然后调用成员函数在屏幕输出学生信息。 编程环境:vs2010,语言:c++ 属性:控制台应用程序。

    java源码包4

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    Javascript中 带名 匿名 箭头函数的重要区别(推荐)

    区别:匿名函数需要讲地址赋值给另一个变量let a,然后再用a来调用函数;而带名函数因为显示地给出了函数名称,所以可以直接用这个函数名称调用。 带名函数返回值是函数体内的返回值,如abs(x)函数的返回值是number...

    JAVA上百实例源码以及开源项目源代码

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    java源码包3

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    JAVA上百实例源码以及开源项目

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    javascript中声明函数的方法及调用函数的返回值

    函数的也不需要像c#那样要求所以路径都需要有返回值(这个不像c#语言,而且c#的方法也不需要在方法名前面在 function关键字) function add(i, j) { //现在只是声明了一个函数在这里,只有调用到它的时候它才会被...

Global site tag (gtag.js) - Google Analytics