我有一个基于PircBotX框架的Java bot。一个IRC机器人只是回复命令。所以现在我有一个静态字符串列表,例如: !weather
,!lastseen
和我的Main.java
文件中的喜欢。创建模块Java
对于我添加的每个命令,我创建一个新的静态字符串,并比较每个传入的消息是否以任何定义的命令开头。
伪
Receive message `m`
if m matches !x
-> do handleX()
if m matches !y
-> do handleY()
这是basicly一个非常大的,如果测试。
我想要做的是创建某种骨架类,它可能实现了一个接口并定义了它应该在哪个命令上行动,以及定义了它应该执行的代码的主体。东西我想的是如下图所示:在这样一类
public class XkcdHandler implements CommandHandlerInterface
{
public String getCommand()
{
return "!xkcd";
}
public void HandleCommand(String[] args, Channel ircChannel)
{
// Get XKCD..
ircChannel.send("The XKCD for today is ..");
}
}
我可以简单地添加一个新的类,并用它做。现在我必须添加命令,在列表中添加if测试,并将该方法添加到Main.java类。这仅仅是一个软件架构的好例子。
有没有一种方法可以创建自动加载这些类(或这些类的实例)的东西,然后调用类似invokeMatchingCommand()
的东西?然后,此代码可以迭代已加载命令的列表,并在匹配的实例上调用HandleCommand
。
更新 随着BalckEye记答案我想我可以加载在一个包(即Modules
),实例化并将其存储在列表中找到的所有类。通过这种方式,我可以按照他的回答中所示处理每条消息(即迭代列表并为每个匹配命令执行类方法)。
但是,根据this thread,它似乎并不真正可行。在这一点上,我看看类加载器,也许这将是一个可行的解决方案。
老实说,我得到你想要动态做到这一点,但它是一个相当麻烦来做到这一点。当你使用user4335475的方法时,它会很简单和干净。另外,它更多的API风格:P – engineercoding 2014-12-08 17:33:38