您的位置:首页 > 编程语言

劣质代码的产生原因(2)编程语言知识不足 (续)

2012-10-27 15:48 351 查看
2.反射 (Reflect)
反射是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();
}

}


这样通过名称可以来生成类的实例。上面的例子是状态模式,可以举一反三想到策略模式,比如:计算器可以根据符号的名称来生成计算的类。具体的制作留给读者来尝试。  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: