需求
我有一个自动化测试的用例用来测试一系列金融产品(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权限等,可能会在另外一篇笔记当中详细描述。