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权限等,可能会在另外一篇笔记当中详细描述。

猜你喜欢

转载自dandada.iteye.com/blog/2229523
今日推荐