Java 将接口的类信息存储在hashmap中,然后创建该接口的实例

Java 将接口的类信息存储在hashmap中,然后创建该接口的实例,java,Java,我想制作一个HashMap,其中String作为键,以及一个表示实现ICommand的类的值。我希望这样做,因为我希望以字符串形式获取命令,检查该命令是否存在(加载在HashMap中),创建该命令的实例,然后运行它。我知道类型,但是类型可以表示任何类型的类,而不是实现我的接口的东西。到目前为止,我有以下几点: 我知道我可以使用switch,但它很难看,以后可能会添加自定义命令 public class Commands { // will register commands later

我想制作一个
HashMap
,其中
String
作为键,以及一个表示实现
ICommand
的类的值。我希望这样做,因为我希望以字符串形式获取命令,检查该命令是否存在(加载在
HashMap
中),创建该命令的实例,然后运行它。我知道
类型
,但是
类型
可以表示任何类型的类,而不是实现我的接口的东西。到目前为止,我有以下几点:

我知道我可以使用switch,但它很难看,以后可能会添加自定义命令

public class Commands
{
    // will register commands later
    HashMap<String, Type> _commands;
    public void parseCommand(String command)
    {
        String[] args = command.split("\\s+");
        if (args.length > 0 && _commands.containsKey(args[0]))
        {
            // should create instance of _commands[args[0]] here
        }
    }

    // will load commands dynamically later
    public interface ICommand
    {
        public String getCommandName();
        public void execute(String args);
        //public void printHelp();
    }

    public class HelpCommand implements ICommand
    {
        public String getCommandName()
        {
            return "help";
        }
        public void execute(String args)
        {
            System.out.println("help - print help");
            System.out.println("exit - quit the server");
            System.out.println("register username password - creates user");
        }

    }

    public class ExitCommand implements ICommand
    {
        public String getCommandName()
        {
            return "exit";
        }
        public void execute(String args)
        {
            // todo save state, log out users, etc.
            System.exit(0);
        }
    }
}
公共类命令
{
//稍后将注册命令
HashMap_命令;
公共命令(字符串命令)
{
字符串[]args=command.split(\\s+);
if(args.length>0&&u commands.containsKey(args[0]))
{
//应在此处创建_命令[args[0]]的实例
}
}
//稍后将动态加载命令
公共接口ICommand
{
公共字符串getCommandName();
公共void execute(字符串参数);
//public-void-printHelp();
}
公共类HelpCommand实现ICommand
{
公共字符串getCommandName()
{
返回“帮助”;
}
公共void执行(字符串参数)
{
System.out.println(“帮助-打印帮助”);
System.out.println(“退出-退出服务器”);
System.out.println(“注册用户名密码-创建用户”);
}
}
公共类ExitCommand实现ICommand
{
公共字符串getCommandName()
{
返回“退出”;
}
公共void执行(字符串参数)
{
//todo保存状态、注销用户等。
系统出口(0);
}
}
}

Map表示类的值到底是什么意思?你说的是类的实例还是类本身?@KumarAbhinav我不想创建命令的实例,我想存储该命令的信息,以便以后可以创建该类的实例。哦,谢谢。我如何在地图上加载我的类?是否使用
instanceof
运算符?而且,非常有用。非常感谢你!反射很好,但它能处理类的实现者没有无参数构造函数或任何扩展ICommand的接口的情况go@Pacha-您可以使用诸如
\u commands.put(“key”,ConcreteCommandClass.class)之类的表达式以初始化映射。
Map<String, Class<? extends ICommand>> map;
Class<? extends ICommand> type = map.get("someCommand");
ICommand command = type.newInstance();
command.execute();