JavaRush /Java блог /Архив info.javarush /Как вызвать метод math(x, y) (или конструктор) с консоли...
mensaLevel
20 уровень
Киев

Как вызвать метод math(x, y) (или конструктор) с консоли программы, результатом выполнения которой будет x+y, которая выведется на экран?

Статья из группы Архив info.javarush
Например есть метод public static void math(int x, int y){ System.out.println(x+y); } 1. Запрос с клавитуры BufferedReader: 2. Пишем в консоль math(5,4) 3. Вывод результата на экран Результат равен: 9
Комментарии (4)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
mensaLevel Уровень 20
4 апреля 2016
Спасибо большое. Сижу пока на 20 уровне, как куплю подписку — буду решать задачи.
Joysi Уровень 41
4 апреля 2016
Блин, чего то я с утра такой плохой (простите меня). Если функций мало, можно просто с помощью сравнения вместо reflection:
package com.javarush.test.level00.lesson01.task01;
import java.io.*;
public class RunFromConsole {
    public static void plus(int x, int y){ System.out.println(x+y);}
    public static void minus(int x, int y){System.out.println(x-y);}
    public static void multiply(int x, int y){System.out.println(x*y);}

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String inputString;
        // считаем строку с консоли, если ввели "exit" - на выход
        while (!"exit".equals(inputString = reader.readLine())) {
            // получаем операцию (как часть строки до открывающей скобки)
            String operation = inputString.substring(0, inputString.indexOf('('));
            // получаем аргументы операции (как часть строки между скобкой и запятой)
            int arg1 = Integer.parseInt(inputString.substring(inputString.indexOf('(') + 1, inputString.indexOf(',')));
            int arg2 = Integer.parseInt(inputString.substring(inputString.indexOf(',') + 1, inputString.indexOf(')')));

            // Проверка введенной операции и выполнение
            if ("plus".equals(operation)) plus(arg1, arg2);
            if ("minus".equals(operation)) minus(arg1, arg2);
            if ("multiply".equals(operation)) multiply(arg1, arg2);
           }
        // Закроем поток чтения с консоли
        reader.close();
    }
}


Вывод:
plus(1,2)
3
minus(3,4)
-1
multiply(-12,453)
-5436
Joysi Уровень 41
4 апреля 2016
Вообще то вы изучите reflection-ы вначале 20-х уровней, но если любопытно, то вот пример очень простенького консольного калькулятора (без обработки ошибок, проверок и тщательных разборов введенной строки):
package com.javarush.test.level00.lesson01.task01;

import java.io.*;
import java.lang.reflect.*;

public class RunFromConsole {
    public static void plus(int x, int y){
        System.out.println(x+y);
    }

    public static void minus(int x, int y){
        System.out.println(x+y);
    }

    public static void multiply(int x, int y){
        System.out.println(x*y);
    }

    public static void main(String[] args) throws IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String inputString;
        // считаем строку с консоли, если ввели "exit" - на выход
        while (!"exit".equals(inputString = reader.readLine())) {
            // получаем операцию
            String operation = inputString.substring(0, inputString.indexOf('('));
            // получаем аргументы операции
            int arg1 = Integer.parseInt(inputString.substring(inputString.indexOf('(') + 1, inputString.indexOf(',')));
            int arg2 = Integer.parseInt(inputString.substring(inputString.indexOf(',') + 1, inputString.indexOf(')')));

            RunFromConsole rfc = new RunFromConsole(); // Создадим экземпляр класса, чтобы в дальнейшем вызвать его метод

            // Тут у нас параметры методов
            Class[] paramTypes = new Class[]{int.class, int.class};
            // А тут мы ищем метод по имени и параметрам (можно только по имени, если нет
            // перегрузки функций, тогда строка кода ранее не нужна)
            Method method = RunFromConsole.class.getMethod(operation, paramTypes);
            // Формируем  аргументы для передачи их в функ