劣质代码的产生原因(2)编程语言知识不足 (续)
2012-10-27 15:48
351 查看
2.反射 (Reflect)
反射是Java1.5开始出现的特性,反射是通过名称访问类、方法、域、声明的方法。反射方法的出现为Java增加了更多的特性。
a.访问private类型的属性和方法
由于不能访问private的域和方法而无法对相应的功能进行xUnit的测试。但是反射提供了访问private方法的途径,所以,对于private的方法可以进行xUnit测试。
采用了反射机制可以帮助增加测试覆盖率。
b.遍历域、声明或者方法
如前节所述,为了能够实现对域的校验,需要对所有的域进行遍历。前节中的例子已经提到了对于方法、域、声明的遍历方法。
c.根据名称生成不同类型的对象实例
在采用状态模式(State Pattern)或者策略模式(Strategy Pattern)的时候,可以根据名称来进行类的实例的生成。
这样通过名称可以来生成类的实例。上面的例子是状态模式,可以举一反三想到策略模式,比如:计算器可以根据符号的名称来生成计算的类。具体的制作留给读者来尝试。
反射是Java1.5开始出现的特性,反射是通过名称访问类、方法、域、声明的方法。反射方法的出现为Java增加了更多的特性。
a.访问private类型的属性和方法
由于不能访问private的域和方法而无法对相应的功能进行xUnit的测试。但是反射提供了访问private方法的途径,所以,对于private的方法可以进行xUnit测试。
public class Testee { private void execute(){ System.out.println("method called"); } }
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import org.junit.After; import org.junit.Before; import org.junit.Test; public class Tester { @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { } @Test public void test() { Testee testee = new Testee(); try { Method method = Testee.class.getDeclaredMethod("execute", new Class[]{}); method.setAccessible(true); method.invoke(testee, null); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }
采用了反射机制可以帮助增加测试覆盖率。
b.遍历域、声明或者方法
如前节所述,为了能够实现对域的校验,需要对所有的域进行遍历。前节中的例子已经提到了对于方法、域、声明的遍历方法。
c.根据名称生成不同类型的对象实例
在采用状态模式(State Pattern)或者策略模式(Strategy Pattern)的时候,可以根据名称来进行类的实例的生成。
public interface State { public void run(); }
public class AState implements State { @Override public void run() { System.out.println("A state"); } }
public class BState implements State { @Override public void run() { System.out.println("B state"); } }
public class StateFactory { public static State create(String name) { Class clazz; try { clazz = Class.forName(name +"State"); return (State) clazz.newInstance(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return null; } }
public class Starter { public static void main(String[] args) { String name = "A"; State state = StateFactory.create(name); state.run(); } }
这样通过名称可以来生成类的实例。上面的例子是状态模式,可以举一反三想到策略模式,比如:计算器可以根据符号的名称来生成计算的类。具体的制作留给读者来尝试。
相关文章推荐
- 劣质代码的产生原因(2)编程语言知识不足 (续4)
- 劣质代码的产生原因(2)编程语言知识不足 (续2)
- 劣质代码的产生原因(2)编程语言知识不足 (续3)
- 劣质代码产生的根源(2) 编程语言知识不足
- 劣质代码的产生原因(5)英语能力不足
- 劣质代码的产生原因(3)编程环境不熟悉
- 劣质代码的产生原因(4)管理者的误导
- 劣质代码产生的八个原因
- 【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—基础知识篇
- 劣质代码产生的八个原因
- 劣质代码产生的八个原因
- 《叩响C#之门》接触窗体编程 基本知识 和 自动产生的部分代码分析(11月7日更新)
- 劣质代码产生的五个原因
- 【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—基础知识篇
- 劣质代码产生的八个原因
- 劣质代码产生的根源(1) 理论知识的匮乏
- 劣质代码产生的根源(1) 理论知识的匮乏(续)
- C# 语言的多线程编程,完全是本科OS里的知识
- ABAP--ABAP语言对象编程的一些样例代码连接收集
- 劣质代码是怎么产生的