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();