Например есть метод
public static void math(int x, int y){
System.out.println(x+y);
}
1. Запрос с клавитуры BufferedReader:
2. Пишем в консоль
math(5,4)
3. Вывод результата на экран
Результат равен: 9
Блин, чего то я с утра такой плохой (простите меня). Если функций мало, можно просто с помощью сравнения вместо 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();
}
}
Вообще то вы изучите 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);
// Формируем аргументы для передачи их в функ
ошибку в minus() поправьте сами, только что заметил :) + грубая, непростительная ошибка — создание класса перед вызовом его метода (чего делать не следует, если методы — статические):
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(')')));
// Тут у нас параметры методов
Class[] paramTypes = new Class[]{int.class, int.class};
// А тут мы ищем метод по имени и параметрам (можно только по имени, если нет
// перегрузки функций, тогда строка кода ранее не нужна)
Method method = RunFromConsole.class.getMethod(operation, paramTypes);
// Формируем аргументы для передачи их в функцию
Object[] arguments = new Object[]{new Integer(arg1), new Integer(arg2)};
// Собственно вызов (экземпляр класса создавать не надо, так как вызываемы
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Вывод:
грубая, непростительная ошибка — создание класса перед вызовом его метода (чего делать не следует, если методы — статические):