动态方法调度
在互联网上有很多关于动态调度的信息,我觉得自己像个鸡,因为我无法实现它。 请帮我。 这是我想要做的。
ClassA{ public void createReq(){ } public String postReq(){ } } ClassB{ @Test public void myTest(){ Class A = new ClassA(); a.createReq(); String test = a.getResponse(); /* Not sure how do i do this part */ }
所以,我在myTest
方法中得到一个字符串'test'
。 我想创建一个扩展ClassB
的ClassC
,并编写一个方法,用于在步骤( a.getResponse()
)之后很快validationmyTest
返回的字符串。
如果没有实施ClassC
,我只想简单地结束测试。 如果只存在ClassC
并实现validation方法,我希望validation完成。
我该怎么做呢? 请帮忙。 谢谢。
您可以创建一个Dispatcher
接口,它只是定义一个方法dispatch(String)
(或者您尝试实现的任何方法)。 基类(ClassB)使用NullPattern实现接口,而子类(ClassC)根据您的需要实现接口。
界面非常简单:
public interface Dispatcher { public void dispatch(String message); }
NullPattern的实现方式如下:
public class NullDispatcher implements Dispatcher { public void dispatch(String message) { // do nothing } }
ClassB应该像这样修改:
public class ClassB { private Dispatcher dispatcher; public ClassB() { dispatcher = new NullDispatcher(); } public void setDispatcher(Dispatcher dispatcher) { // change this to your needs if (dispatcher == null) dispatcher = new NullDispatcher(); else this.dispatcher = dispatcher; } @Test public void myTest() { ClassA a = new ClassA(); a.createRequest(); String test = a.getResponse(); dispatcher.dispatch(test); } }
这里可以使用setDispatcher(Dispatcher)
方法设置新的Dispatcher
。 此调度程序将在myTest
用于调度a.getResponse()
的结果。
扩展类只需要设置Dispatcher
的特定实现。 要打开对控制台的响应,您可以实现ConsoleDispatcher
如下所示:
public class ConsoleDispatcher implements Dispatcher { public void dispatch(String message) { System.out.println(message); } }
要在ConsoleDispatcher
使用ConsoleDispatcher
而不是NullDispatcher
,您可以使用类似于的代码:
public class ClassC extends ClassB { public ClassC() { this.setDispatcher(new ConsoleDispatcher()); } }
当ClassC扩展ClassB时,您将可以访问myTest
,该myTest
使用定义的调度程序相应地分派消息。
HTH
尝试使用reflection加载ClassC。 如果该尝试失败,则您的ClassC不存在,因此默认情况下validation是正常的。 如果存在ClassC,请尝试找到正确的方法并使用reflection调用它。 如果您没有找到该方法,则默认情况下validation再次正常(我猜)。 如果找到方法,并且对它的调用返回true,那么你就完成了,validation就可以了。 如果此调用返回false,则validation失败。
检查这些链接,我认为你应该得到我说的。
http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#forName%28java.lang.String%29