Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Пример 2.2.

Читайте также:
  1. V. Примерный образец теста, применяемого для промежуточной аттестации
  2. Web-контейнер, Servlet, JSP. Структура, назначение и пример сервлета или JSP.
  3. А вот чрезмерное употребление алкоголя действительно вызывает гинекомастию. Примерно четверо из 10 хронических алкоголиков имеют это заболевание в той или иной стадии развития.
  4. А. Здравомыслов.Примерно два года тому назад.
  5. Ая основа – Хаджури не видит разницы между нововведенцем, призывающим к своему нововведению, и не призывающим, и пример в этом он взял с Махмуда Хаддада.
  6. Будьте хорошим примером для своих детей
  7. Быть примером
  8. В наших примерах мы ни разу не рассматривали конструкторы классов, поэтому при создании экземпляров наших классов вызывался конструктор класса object.
  9. В приведенном примере нарушение синтезов пространственного гнозиса и обусловливает ряд следствий, что можно представить схематично.
  10. В только что приведенном вами примере с под­брасыванием монеты компьютерное моделирование

 

package Command.java;import java.awt.event.*;import java.beans.*;import java.lang.reflect.*;import java.io.*;import java.util.*; /** * Этот класс представляет объект Method, список аргументов, передаваемых * этому методу, и объект, из которого этот метод должен вызываться. * Метод invoke() вызывает метод. Метод actionPerformed() делает то же * самое, позволяя этому классу реализовывать ActionListener и использовать * его для реакции на события ActionEvents генерируемые в GUI или ОС. * Статический метод parse() определяет строку, представляющую метод * и его аргументы. **/public class Command implements ActionListener { Method m; // Вызываемый метод Object target; // Объект, из которого вызывается метод Object[] args; // Аргументы, передаваемые методу // Пустой массив: используется для методов, не имеющих аргументов. static final Object[] nullargs = new Object[] {}; /** Этот конструктор создает объект Command для метода без аргументов */ public Command(Object target, Method m) { this(target, m, nullargs); } /** * Этот конструктор создает объект Command для метода, принимающего * заданный массив аргументов. Отметим, что метод parse() предоставляет * еще один способ создания объекта Command **/ public Command(Object target, Method m, Object[] args) { this.target = target; this.m = m; this.args = args; } /** * Метод Invoke вызывает Command посредством метода из его объекта target * и передачи аргументов. См. также actionPerformed() который, * в отличие от этого метода, не выдает ошибок. **/ public void invoke() throws IllegalAccessException, InvocationTargetException { m.invoke(target, args); // Используем reflection для вызова метода } /** * Этот метод реализует интерфейс ActionListener. Он похож на метод * invoke() с тем отличием, что перехватывает выданные методом ошибки * и передает их в виде непроверяемого исключения RuntimeException **/ public void actionPerformed(ActionEvent e) { try { invoke(); // Обращаемся к вызывающему методу } catch (InvocationTargetException ex) { // но обрабатываем ошибки throw new RuntimeException("Command: " + ex.getTargetException().toString()); } catch (IllegalAccessException ex) { throw new RuntimeException("Command: " + ex.toString()); } } /** * Этот статический метод создает объект Command с использованием * заданного объекта target и заданной строки. Эта строка должна содержать * имя метода, за которым следует необязательный, заключенный в скобки * список аргументов, разделенных запятыми или точкой с запятой. * Аргументы могут быть литералами типа boolean, integer или double, * или заключенными в двойные кавычки строками. Компилятор не * обращает внимания на пропущенные знаки препинания, но выдает * ошибку IOException, если не удается распознать строку **/ public static Command parse(Object target, String text) throws IOException { String methodname; // Имя метода ArrayList args = new ArrayList(); // Будет содержать // разобранные аргументы ArrayList types = new ArrayList(); // Будет содержать типы аргументов. // Преобразуем строку в символьный поток и применим класс // StreamTokenizer для преобразования его в поток лексем StreamTokenizer t = new StreamTokenizer(new StringReader(text)); // Первой лексемой должно быть имя метода int c = t.nextToken(); // читаем лексему if (c!= t.TT_WORD) // проверяем ее тип throw new IOException("Отсутствует имя метода для команды"); methodname = t.sval; // Запоминаем имя метода // Далее должна следовать либо точка с запятой, либо открывающая скобка c = t.nextToken(); if (c == '(') { // Обнаружив открывающую скобку, разбираем список // аргументов for(;;) { // Цикл до конца списка аргументов c = t.nextToken(); // Читаем следующую лексему if (c == ')') { // Проверяем, не конец ли это списка. c = t.nextToken(); // Если да, выделяем необязательную // точку с запятой if (c!= ';') t.pushBack(); break; // Выходим из цикла. } // Если нет, лексема является аргументом: определяем ее тип if (c == t.TT_WORD) { // Если лексема является идентификатором (identifier), // выделяем логические литералы, а все другие лексемы // интерпретируем как строковые литералы без кавычек. if (t.sval.equals("true")) { // Литерал типа Boolean args.add(Boolean.TRUE); types.add(boolean.class); } else if (t.sval.equals("false")) { // Литерал типа Boolean args.add(Boolean.FALSE); types.add(boolean.class); } else { // Считаем, что это строка args.add(t.sval); types.add(String.class); } } else if (c == '"') { // Если лексема – это строка в кавычках args.add(t.sval); types.add(String.class); } else if (c == t.TT_NUMBER) { // Если лексема – это число int i = (int) t.nval; if (i == t.nval) { // Проверка типа числа integer // Лексема вида "2.0" будет интерпретирована как целое число! args.add(new Integer(i)); types.add(int.class); } else { // В противном случае она принадлежит типу double args.add(new Double(t.nval)); types.add(double.class); } } else { // Любая другая лексема является ошибкой throw new IOException("Неизвестная лексема " + t.sval + " в списке аргументов метода " + methodname + "()."); } // Далее должна следовать запятая, если ее нет, то игнорируем c = t.nextToken(); if (c!= ',') t.pushBack(); } } else if (c!= ';') { // Если нет запятой, то должна быть точка с запятой, t.pushBack(); // если их нет, то игнорируем. } // Мы разобрали список аргументов.// Теперь преобразуем списки аргументов в массивы соответствующих типов Object[] argValues = args.toArray(); Class[] argtypes = (Class[])types.toArray(new Class[argValues.length]); // Здесь уже есть имя метода и значения аргументов соответствующих типов // Применяем reflection к классу объекта target // чтобы найти метод с соответствующим именем и аргументами. // Если такого метода нет, выдаем сообщение. Method method; try { method = target.getClass().getMethod(methodname, argtypes); } catch (Exception e) {throw new IOException("Нет такого метода или неправильно заданы " + "типы аргументов: " + methodname); } // Наконец, создаем и возвращаем объект Command, используя // переданный этому методу объект полученный выше объект Method // и массив аргументов в виде строк. return new Command(target, method, argValues); } /** * Эта программа показывает, как объект Command object может быть * использован для вывода строк ActionListener в Swing-приложении. **/ static class Test { public static void main(String[] args) throws IOException { javax.swing.JFrame f = new javax.swing.JFrame("Command Test"); javax.swing.JButton b1 = new javax.swing.JButton("Tick"); javax.swing.JButton b2 = new javax.swing.JButton("Tock"); javax.swing.JLabel label = new javax.swing.JLabel("Hello world"); java.awt.Container pane = f.getContentPane(); pane.add(b1, java.awt.BorderLayout.WEST); pane.add(b2, java.awt.BorderLayout.EAST); pane.add(label, java.awt.BorderLayout.NORTH); b1.addActionListener(Command.parse(label, "setText(\"tick\");")); b2.addActionListener(Command.parse(label, "setText(\"tock\");")); f.pack(); f.show(); } }}

 




Дата добавления: 2015-09-11; просмотров: 21 | Поможем написать вашу работу | Нарушение авторских прав

ВВЕДЕНИЕ | Глава 1.1. Особенности разработки программы на языке Java | Практическое занятие № 1 | Практическое занятие № 2 | Практическое занятие № 3 | Практическое занятие № 4 | Практическое занятие № 5 | Практическое занятие № 6 | Практическое занятие № 7 | Компоненты. |


lektsii.net - Лекции.Нет - 2014-2024 год. (0.009 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав