Java 在运行时动态选择类

Java 在运行时动态选择类,java,jakarta-ee,class-design,classloader,Java,Jakarta Ee,Class Design,Classloader,我正试图想出一个解决方案,在运行时根据消息类型选择处理消息的类。 我知道我可以用这样的东西 if msg_type = "A" MsgAProcessor.execute(message); else if msg_type = "B" MsgBProcessoror = execute(message); .... .... .... 我不想使用上面的方法,因为我不想让代码知道任何关于我可以处理的消息类型的信息。我希望将来能够为新的消息类型添加新的消息处理器。我目前正在考虑的解决办法

我正试图想出一个解决方案,在运行时根据消息类型选择处理消息的类。 我知道我可以用这样的东西

if msg_type = "A"
  MsgAProcessor.execute(message);
else if msg_type = "B"
  MsgBProcessoror = execute(message);
....
....
....
我不想使用上面的方法,因为我不想让代码知道任何关于我可以处理的消息类型的信息。我希望将来能够为新的消息类型添加新的消息处理器。我目前正在考虑的解决办法如下

目前有3个消息处理器

MsgAProcessor
MsgBProcessor
MsgBProcessor
这三个类都有一个名为execute的方法,它将以自己的方式处理消息。我创建了一个名为MsgProcessor的接口,并在接口中添加了execute方法

现在我很难知道调用方应该调用哪个消息处理器,而不必检查消息类型。例如,我不能这样做

MsgProcessor proc=新的MsgAprocessor 执行程序

上述内容仍然需要包含在if语句中,因为它需要在找到消息类型后立即调用。我还希望避免使用实现类类型进行实例化

有没有更好的方法实现同样的目标


我希望能够从接口调用MsgProcessor.execute,并让运行时环境知道根据消息类型调用哪个实现类

您可以使用映射从消息类型映射到消息处理器。要分离实现,可以使用ServiceLoader:

您可以使用映射从消息类型映射到消息处理器。要分离实现,可以使用ServiceLoader:

有一个执行方法的接口处理器。您的三个msgp处理器都实现了这一点。 具有单独的类ProcessorControl,该类具有submitString消息方法。每当出现新消息时,只需执行ProcessorControl.submitmessage即可 现在ProcessorControl有一个addProcessorProccesor proc方法,String type,它将处理器添加到以type作为键的哈希表中。因此,现在为每个处理器分配了一个类型。 在submit方法中,只需获取hashtable.gettype.executeproc 这是一个简单的命令模式

有一个执行方法的接口处理器。您的三个msgp处理器都实现了这一点。 具有单独的类ProcessorControl,该类具有submitString消息方法。每当出现新消息时,只需执行ProcessorControl.submitmessage即可 现在ProcessorControl有一个addProcessorProccesor proc方法,String type,它将处理器添加到以type作为键的哈希表中。因此,现在为每个处理器分配了一个类型。 在submit方法中,只需获取hashtable.gettype.executeproc
这是一个简单的命令模式。

很快您就想使用动态类加载:class.forname类名

您的命令可以包含完全限定的类名,也可以使用属性文件或命名约定映射到该类名。命令的所有实现都应该像以前一样实现接口。收到命令get class name后,创建命令实例并调用其execute方法:


ProcessorClass.forNameclassName.newInstance.execute

如果要使用动态类加载:class.Forname类名

您的命令可以包含完全限定的类名,也可以使用属性文件或命名约定映射到该类名。命令的所有实现都应该像以前一样实现接口。收到命令get class name后,创建命令实例并调用其execute方法:


ProcessorClass.forNameclassName.newInstance.execute是一个小而有用的增强:在处理器接口中添加canExecuteString消息方法。在ProcessorControl中,维护处理器列表,而不是处理器映射。当消息出现时,通过处理器循环并对每个处理器调用canExecute。返回true的是正确的。这样做的好处是,检查消息类型的代码现在位于处理器中,只要注册部分是使用属性文件的数据驱动器,就可以在不更改任何代码的情况下添加新的处理器,这是一个小而有用的增强:在处理器接口中添加canExecuteString消息方法。在ProcessorControl中,维护处理器列表,而不是处理器映射。当消息出现时,通过处理器循环并对每个处理器调用canExecute。返回true的是正确的。这样做的好处是,检查消息类型的代码现在位于处理器中,只要注册部分是使用属性文件(例如)的数据驱动器,就可以在不更改任何代码的情况下添加新处理器