LINUX.ORG.RU

История изменений

Исправление crutch_master, (текущая версия) :

Короче, я сдедал через Reflection и, в принципе, доволен. У меня класс с командами, куда я всё пишу и вот эта херня их ищет

    @Autowired
    private Commands commands;

    private HashMap<String, Method> commandsList;

    public MksControl() {
        commandsList = new HashMap<String, Method>();
        Method[] ms = Commands.class.getMethods();
        for (Method m : ms) commandsList.put(m.getName(), m);
    }

    public String control(String msg) {
        String[] cmd = msg.split(" ");

        String commandStr = cmd[0];
        String[] args = Arrays.copyOfRange(cmd, 1, cmd.length);

        Method m = commandsList.get(commandStr);
        if (m == null) return "Command not found:"+commandStr;

        int c = m.getParameterCount();
        if (c <= args.length) {
            String ret = "Error";
            try {
                args = Arrays.copyOfRange(args, 0, c);
                ret = (String)m.invoke(commands, (Object[])args);
            } catch (Exception e) {
                return "Error when calling command:"+e.getMessage();
            }
            return ret;
        }
        return "Need more args for "+commandStr+"("+c+" vs "+args.length+")";
    }
В rmq я отправляю название метода и агрументы через пробел. Надо теперь сделать как-то, чтобы Commands могло быть любое.

Исходная версия crutch_master, :

Короче, я сдедал через Reflection и, в принципе, доволен. У меня класс с командами, куда я всё пишу и вот эта херня их ищет

    @Autowired
    private Commands commands;

    private HashMap<String, Method> commandsList;

    public MksControl() {
        commandsList = new HashMap<String, Method>();
        Method[] ms = Commands.class.getMethods();
        for (Method m : ms) commandsList.put(m.getName(), m);
    }

    public String control(String msg) {
        String[] cmd = msg.split(" ");

        String commandStr = cmd[0];
        String[] args = Arrays.copyOfRange(cmd, 1, cmd.length);

        Method m = commandsList.get(commandStr);
        if (m == null) return "Command not found:"+commandStr;

        int c = m.getParameterCount();
        if (c <= args.length) {
            String ret = "Error";
            try {
                args = Arrays.copyOfRange(args, 0, c);
                ret = (String)m.invoke(commands, (Object[])args);
            } catch (Exception e) {
                return "Error when calling command:"+e.getMessage();
            }
            return ret;
        }
        return "Need more args for "+commandStr+"("+c+" vs "+args.length+")";
    }
В rmq я отправляю название метода и агрументы через пробел. Надо теперь сделать как-то, чтобы Commands могло быть любое.