private void addCmdInCalc( CStackCalc calc, String cmdName, String className, Hashtable<FieldCmdKind, Object> fieldsValue) { Class cls; // Полученный по тектовому имени объект класса Class. Object o; // Создаваемый по имени класса объект команды. ICmd cmd; // Объект команды, приведенный к базовому классу команды. try { cls = Class.forName(className); o = cls.newInstance(); if (o instanceof ICmd) { cmd = (ICmd) o; cmd.setCmdText(cmdName.toUpperCase()); InitFieldCmd(cmd, fieldsValue); if (proxyMode == ProxyMode.PROXYIN) cmd = cmdProxy(cmd); calc.addCmdCalc(cmd); log.info("Добавили команду в калькулятор (" + cmd.getCmdText() + ")!"); } } catch (Exception e) { log.warn( "При создании команды для калькулятора использовано неизвестное имя класса (" + className + ")!"); } }
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if ("getCmdText".equals(method.getName())) { return cmd.getCmdText(); } if ("setCmdText".equals(method.getName())) { if (args.length > 0) cmd.setCmdText((String) args[0]); return (Void.TYPE); } if ("execute".equals(method.getName())) { if (args.length > 0) { if (log.isDebugEnabled()) { log.debug("Stack before:"); outStackInLog(); log.debug("Context:"); outContextInLog(); StringBuilder outStr = new StringBuilder(); log.debug("Arguments:"); for (Object iArgs : args) { outStr.append(iArgs); outStr.append("; "); } log.debug(outStr); } cmd.execute((String) args[0]); // Результат реально отработавшей функции. if (log.isDebugEnabled()) { log.debug("Stack After:"); outStackInLog(); } } return Void.TYPE; } return null; // To change body of implemented methods use File | Settings | File Templates. }
private void InitFieldCmd(ICmd cmd, Hashtable<FieldCmdKind, Object> fieldsValue) { Class c = cmd.getClass(); // Класс рассматриваемой команды. Field f[]; // Набор полей рассматриваемого класса. while (c != null) { f = c.getDeclaredFields(); for (Field iF : f) { setFieldValue(iF, cmd, fieldsValue); } c = c.getSuperclass(); } }