Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
public String getDescription(String name) {
return "Prints help infomation.";
}
public String getHelp(String name) {
return "Prints help infomation."
+ CRLF + "Syntax: " + name + " [command]";
}
private Interpreter interpreter;
private final static String CRLF =
System.getProperty("line.separator");
}
Динамическое изменение системы команд
Посмотрев на код нашего конкретного интерпретатора, можно заметить, что система команд целевого языка фиксируется еще на этапе компиляции кода. Это не очень гибкое решение.
Конечно же, можно переписать метод initCommands так, чтобы он создавал систему команд «на лету», считывая ее описание из конфигурационного файла.
Но более интересным решением может оказаться встраивание возможности изменения системы команд непосредственно в целевой язык.
Давайте закодируем пару команд RegisterCommand/UnregisterCommand, первая из которых будет добавлять команду к системе команд, а вторая – удалять ее оттуда.
Команда RegisterCommand должна вызываться с двумя обязательными параметрами. Первый – имя, под которым будет зарегистрирована новая команда. Второй – полностью квалифицированное имя класса, реализующего новую команду, причем этот класс должен удовлетворять ряду ограничений:
n класс должен реализовывать интерфейс Command;
n класс должен предоставлять конструктор без параметров;
n класс должен быть доступен для Java VM через CLASSPATH.
package simplecli.command;
import java.util.*;
import simplecli.*;
import simplecli.error.*;
public class RegisterCommand implements Command {
public RegisterCommand(Interpreter interpreter) {
this.interpreter = interpreter;
}
public String run(Properties context,
ArrayList parameters) throws SyntaxError,
KnownCommandError, ClassNotFoundError, ClassCastError {
if (parameters.size() != 2) {
throw new SyntaxError();
}
String name = (String) parameters.get(0);
String clazzName = (String) parameters.get(1);
Hashtable commands = interpreter.getCommands();
if (commands.containsKey(name)) {
throw new KnownCommandError();
}
Class clazz = null;
try {
clazz = Class.forName(clazzName);