动态方法调度

在互联网上有很多关于动态调度的信息,我觉得自己像个鸡,因为我无法实现它。 请帮我。 这是我想要做的。

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' 。 我想创建一个扩展ClassBClassC ,并编写一个方法,用于在步骤( 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

http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getMethod%28java.lang.String,%20java.lang.Class…%29

http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Method.html#invoke%28java.lang.Object,%20java.lang.Object…%29